Kaip perduoti komandų eilutės argumentus į griovelio komandą

Turiu rake užduotį, kuri turėtų įterpti vertę į kelias duomenų bazes.

Norėčiau perduoti šią vertę komandų eilutės komandai arba kitai užduočiai.

Kaip tai padaryti?

898
05 мая '09 в 19:27 2009-05-05 19:27 „Tilendor“ rinkinys gegužės 05'09 , 19:27, 2009-05-05 19:27
@ 17 atsakymų

Parametrai ir priklausomybės turi būti matricų viduje:

 namespace :thing do desc "it does a thing" task :work, [:option, :foo, :bar] => [:environment] do |t, args| puts "work", args end task :another, [:option, :foo, :bar] => [:environment] do |t, args| puts "another #{args}" Rake::Task["thing:work"].invoke(args[:option], args[:foo], args[:bar]) # or splat the args # Rake::Task["thing:work"].invoke(*args) end end 

Tada

 rake thing:work[1,2,3] => work: {:option=>"1", :foo=>"2", :bar=>"3"} rake thing:another[1,2,3] => another {:option=>"1", :foo=>"2", :bar=>"3"} => work: {:option=>"1", :foo=>"2", :bar=>"3"} 

PASTABA: kintamasis t netinka task . Tai yra uždavinio objektas, o ne labai naudingas, jei nežinote, ką darote.

166
08 апр. Atsakymas, kurį pateikė Blair Anderson Apr 08 2015-04-08 00:56 '15 prie 0:56 2015-04-08 00:56

Grafike galite nurodyti formalius argumentus, pridedant simbolių argumentus užduočių skambučiui. Pavyzdžiui:

 require 'rake' task :my_task, [:arg1, :arg2] do |t, args| puts "Args were: #{args}" end task :invoke_my_task do Rake.application.invoke_task("my_task[1, 2]") end # or if you prefer this syntax... task :invoke_my_task_2 do Rake::Task[:my_task].invoke(3, 4) end # a task with prerequisites passes its # arguments to it prerequisites task :with_prerequisite, [:arg1, :arg2] => :my_task #<- name of prerequisite task # to specify default values, # we take advantage of args being a Rake::TaskArguments object task :with_defaults, :arg1, :arg2 do |t, args| args.with_defaults(:arg1 => :default_1, :arg2 => :default_2) puts "Args with defaults were: #{args}" end 

Tada iš komandų eilutės:

 > rake my_task [1,2] Args buvo: {: arg1 => "1",: arg2 => "2"} > rake "my_task [1, 2]" Args buvo: {: arg1 => "1",: arg2 => "2"} > rake invoke_my_task Args buvo: {: arg1 => "1",: arg2 => "2"} > rake invoke_my_task_2 Args buvo: {: arg1 => 3,: arg2 => 4} > Rake with_prereite [5,6] Args buvo: {: arg1 => "5",: arg2 => "6"} > Rake with_defaults Args su nutylėjimais buvo: {: arg1 =>: default_1,: arg2 =>: default_2} > Rake with_defaults ['x', 'y'] Args su nutylėjimais buvo: {: arg1 => "x",: arg2 => "y"}
border=0

Kaip parodyta antrajame pavyzdyje, jei norite naudoti erdves, yra būtinos citatos aplink tikslo pavadinimą, kad apvalkalas neišskirtų erdvėje esančių argumentų.

Atsižvelgiant į kodą „ rake.rb“ , atrodo, kad „rake“ neišnagrinėja užduočių eilutės, kad ištrauktų argumentus prielaidoms, todėl jūs negalite atlikti task :t1 => "dep[1,2]" . Vienintelis būdas nurodyti skirtingus argumentus tam, kad prielaida būtų aiškiai įvardijama priklausomai nuo užduoties, kaip :invoke_my_task ir :invoke_my_task_2 .

Atkreipkite dėmesį, kad kai kurioms rake my_task\['arg1'\] (pvz., Zsh) reikalingos petnešos iš jūsų: rake my_task\['arg1'\]

1054
05 мая '09 в 19:45 2009-05-05 19:45 atsakė Nick Desjardins gegužės 05, 09, 19:45 2009-05-05 19:45

Be kch atsakymo (aš neradau, kaip palikti komentarą apie tai, atsiprašau):

Prieš rake komandą nereikia nurodyti kintamųjų kaip ENV kintamųjų. Jūs galite tiesiog juos nustatyti kaip įprastus komandų eilutės parametrus:

 rake mytask var=foo 

ir pasiekti tuos, kurie yra iš „Rake“ failo, kaip ENV kintamieji, pavyzdžiui:

 p ENV['var'] # => "foo" 
260
19 февр. atsakymas pateikiamas Timurb 19 vasario mėn 2011-02-19 14:05 '11, 14:05, 2011-02-19 14:05

Jei norite perduoti nurodytus argumentus (pvz., Su standartiniu „ OptionParser ), galite naudoti kažką panašaus:

 $ rake user:create -- --user test@example.com --pass 123 

pastebėkite, kad -- tai būtina norint apeiti standartinius rake argumentus. Turi dirbti su Rake 0.9.x , <= 10.3.x.

Naujesnė „Rake“ pakeitė savo analizę -- ir dabar jūs turite įsitikinti, kad ji neperduodama „ OptionParser#parse , pvz., Naudojant parser.parse!(ARGV[2..-1])

 require 'rake' require 'optparse' # Rake task for creating an account namespace :user do |args| desc 'Creates user account with given credentials: rake user:create' # environment is required to have access to Rails models task :create do options = {} OptionParser.new(args) do |opts| opts.banner = "Usage: rake user:create [options]" opts.on("-u", "--user {username}","User email address", String) do |user| options[:user] = user end opts.on("-p", "--pass {password}","User password", String) do |pass| options[:pass] = pass end end.parse! puts "creating user account..." u = Hash.new u[:email] = options[:user] u[:password] = options[:pass] # with some DB layer like ActiveRecord: # user = User.new(u); user.save! puts "user: " + u.to_s puts "account created." exit 0 end end 

pabaigoje įsitikinkite, kad papildomi argumentai nebus interpretuojami kaip rake užduotis.

Taip pat turėtų būti nuorodų į argumentus:

  rake user:create -- -u test@example.com -p 123 

Kai „Rake“ scenarijai atrodo taip, gali būti laikas ieškoti kito įrankio, kuris leistų jam tiesiog išeiti iš dėžutės.

84
19 окт. atsakymas duotas Tombart 19 okt. 2013-10-19 16:09 '13, 16:09 pm 2013-10-19 16:09

Radau atsakymą į šias dvi svetaines: „ Net Maniac“ ir „ Aimred“ .

Norėdami naudoti šią techniką, reikės versijos> 0,8 rake

Įprastas „Rake“ užduoties aprašymas:

 desc 'Task Description' task :task_name => [:depends_on_taskA, :depends_on_taskB] do #interesting things end 

Norėdami perduoti argumentus, atlikite tris veiksmus:

  • Po užduoties pavadinimo pridėkite argumentų pavadinimus, atskirtus kableliais.
  • Įdėkite priklausomybes į pabaigą naudodami: needs => [...]
  • Vieta | t, args | po to, kai mes tai darome. (t yra šios užduoties objektas)

Jei norite pasiekti scenarijaus argumentus, naudokite args.arg_name

 desc 'Takes arguments task' task :task_name, :display_value, :display_times, :needs => [:depends_on_taskA, :depends_on_taskB] do |t, args| args.display_times.to_i.times do puts args.display_value end end 

Norėdami iškviesti šią užduotį iš komandų eilutės, pateikite argumentus į [] s

 rake task_name['Hello',4] 

rodo

 Hello Hello Hello Hello 

ir jei norite užduoti šią užduotį iš kitos užduoties ir perduoti savo argumentus, naudokite raginimą

 task :caller do puts 'In Caller' Rake::Task[:task_name].invoke('hi',2) end 

tada komanda

 rake caller 

rodo

 In Caller hi hi 

Neradau būdų perduoti argumentus kaip priklausomybės dalį, nes šis kodas yra sugadintas:

 task :caller => :task_name['hi',2]' do puts 'In Caller' end 
54
05 мая '09 в 19:51 2009-05-05 19:51 atsakė Tilendorui gegužės 05'09 09:51 2009-05-05 19:51

Kitas plačiai naudojamas variantas yra perduoti aplinkos kintamuosius. ENV['VAR'] jūs juos perskaitysite per ENV['VAR'] ir jūs galite juos perduoti tiesiai prieš, pvz., „ rake komandą

 $ VAR=foo rake mytask 
29
05 мая '09 в 19:53 2009-05-05 19:53 atsakymas pateikiamas kch 05 gegužės '09, 19:53 2009-05-05 19:53

Iš tiesų, @Nick Desjardins atsakė puikiai. Bet tik švietimui: galite naudoti purviną požiūrį: naudodami ENV argumentą

 task :my_task do myvar = ENV['myvar'] puts "myvar: #{myvar}" end rake my_task myvar=10 #=> myvar: 10 
29
28 февр. atsakymas pateikiamas fl00r 28 vas . 2011-02-28 23:06 '11, 23:06, 2011-02-28 23:06

Aš negalėjau išsiaiškinti, kaip perteikti argumentus, taip pat ir laikmeną: kol baigsiu tai padaryti:

 namespace :db do desc 'Export product data' task :export, [:file_token, :file_path] => :environment do |t, args| args.with_defaults(:file_token => "products", :file_path => "./lib/data/") #do stuff [...] end end 

Ir tada aš tai vadinu:

 rake db:export['foo, /tmp/'] 
23
29 нояб. Atsakymą pateikė Nate Flink lapkričio 29 d. 2014-11-29 22:38 '14, 10:38 pm 2014-11-29 22:38
 desc 'an updated version' task :task_name, [:arg1, :arg2] => [:dependency1, :dependency2] do |t, args| puts args[:arg1] end 
22
16 окт. atsakymą pateikė Fengas spalio 16 d. 2012-10-16 10:36 '12, 10:36 am 2012-10-16 10:36

Rake faile naudoju įprastą rubino argumentą:

 DB = ARGV[1] 

tada aš ištrinau rake užduotis failo apačioje (kadangi grėblys ieškos užduoties pagal šį argumento pavadinimą).

 task :database_name1 task :database_name2 

:

 rake mytask db_name 

man tai tampa švaresnis nei var = foo ENV var ir užduotys args [blah, blah2].
stub bit jenky, bet ne per blogai, jei turite tik keletą aplinkų, kurios yra vienkartinės nuostatos

12
29 дек. atsakymas pateiktas djburdick 29 d. 2012-12-29 05:48 '12, 5:48, 2012-12-29 05:48

Aš tik norėjau paleisti:

 $ rake some:task arg1 arg2 

Paprasta, ar ne? (Ne!)

Rake interpretuoja arg1 ir arg2 kaip užduotis ir bando juos paleisti. Todėl paprasčiausiai nustojame dirbti prieš tai.

 namespace :some do task task: :environment do arg1, arg2 = ARGV # your task... exit end end 

Paimkite, skliausteliuose!

Atsakomybės apribojimas . Norėjau tai padaryti gana nedideliame namų projekte. Nenaudojamas realiame pasaulyje, nes prarandate gebėjimą prijungti rake užduotis (ty rake task1 task2 task3 ). TJO nėra verta. Tiesiog naudokite bjaurų rake task[arg1,arg2] .

9
29 апр. atsakymas duotas jassa 29 Bal 2016-04-29 06:29 '16 at 6:29 2016-04-29 06:29

Kaip argumentas buvo priimtas, atsakymas yra teisingas. Tačiau norint paleisti rake užduotį su argumentais, yra mažesnė techninė problema su naujesne bėgių versija

Jis veiks su „Rake“ vardų erdve: užduoties pavadinimas ['argumentas1'] "

Atkreipkite dėmesį į atvirkštines kabutes, kai pradedate užduotį iš komandų eilutės.

4
24 апр. Atsakymą pateikė Asim Mushtaq balandžio 24 d 2014-04-24 17:23 '14, 17:23, 2014-04-24 17:23

Man patinka „querystring“ sintaksė argumentų perdavimui, ypač kai yra daug argumentų, kuriuos reikia perduoti.

Pavyzdys:

 rake "mytask[width=10> 

„užklausų eilutė“:

 width=10> 

Įspėjimas: pastebėkite, kad sintaksės rake "mytask[foo=bar]" ir NOT rake mytask["foo=bar"]

Analizuojant Rake užduotį su Rack::Utils.parse_nested_query gauname „ Hash :

 => {"width"=>"10", "height"=>"20"} 

(Šalta, kad galite perduoti maišus ir masyvus, daugiau)

Štai kaip tai padaryti:

 require 'rack/utils' task :mytask, :args_expr do |t,args| args.with_defaults(:args_expr => "width=10 options = Rack::Utils.parse_nested_query(args[:args_expr]) end 

Toliau pateikiamas išsamesnis pavyzdys, kurį naudoju su „Rails“, kai atidarytas_job_active_record_threaded perlas:

 bundle exec rake "dj:start[ebooks[workers_number]=16> 

Suprojektuotas taip, kaip aprašyta aukščiau, priklausomai nuo aplinkos (norint įkelti aplinką „Rails“)

 namespace :dj do task :start, [ :args_expr ] => :environment do |t, args| # defaults here... options = Rack::Utils.parse_nested_query(args[:args_expr]) end end 

Suteikia šias options

 => {"ebooks"=>{"workers_number"=>"16", "worker_timeout"=>"60"}, "albums"=>{"workers_number"=>"32", "worker_timeout"=>"120"}} 
2
17 февр. Atsakymą pateikė Abdo . 2014-02-17 01:05 '14 at 1:05 2014-02-17 01:05

Norėdami perduoti argumentus į numatytąjį darbą, galite tai padaryti. Pvz., Tarkime, kad „Versija“ yra jūsų argumentas:

 task :default, [:version] => [:build] task :build, :version do |t,args| version = args[:version] puts version ? "version is #{version}" : "no version passed" end 

Tada galite jį pavadinti taip:

 $ rake no version passed 

arba

 $ rake default[3.2.1] version is 3.2.1 

arba

 $ rake build[3.2.1] version is 3.2.1 

Tačiau neradau būdų, kaip išvengti užduoties pavadinimo (numatytojo arba statinio) nurodymo, kai pateikiami argumentai. Norėčiau išgirsti, ar kas apie tai žino.

2
20 окт. atsakymas pateikiamas Gal 20 okt. 2013-10-20 22:03 '13, 10:03 val. 2013-10-20 22:03

Dauguma pirmiau aprašytų metodų man neveikia, jie gali būti pasenę naujesnėse versijose. Naujausią vadovėlį galite rasti čia: http://guides.rubyonrails.org/command_line.html#custom-rake-tasks

nukopijuokite ir įklijuokite ansrašus iš vadovo:

 task :task_name, [:arg_1] => [:pre_1, :pre_2] do |t, args| # You can use args from here end 

Skambinkite kaip tai

 bin/rake "task_name[value 1]" # entire argument string should be quoted 
1
03 февр. atsakymas pateikiamas heksineteris 03 vasaris 2015-02-03 04:15 '15 at 4:15 2015-02-03 04:15

Jei negalite nerimauti, kas yra argumento padėtis, ir norite padaryti kažką panašaus į rubino argumentą. Galite naudoti vieną argumentą, kad pereitumėte į eilutę, ir tada pakartotinai naudokite šią eilutę maišos nustatyme.

 namespace :dummy_data do desc "Tests options hash like arguments" task :test, [:options] => :environment do |t, args| arg_options = args[:options] || '' # nil catch incase no options are provided two_d_array = arg_options.scan(/\W*(\w*): (\w*)\W*/) puts two_d_array.to_s + ' # options are regexed into a 2d array' string_key_hash = two_d_array.to_h puts string_key_hash.to_s + ' # options are in a hash with keys as strings' options = two_d_array.map {|p| [p[0].to_sym, p[1]]}.to_h puts options.to_s + ' # options are in a hash with symbols' default_options = {users: '50', friends: '25', colour: 'red', name: 'tom'} options = default_options.merge(options) puts options.to_s + ' # default option values are merged into options' end end 

Ir komandų eilutėje jūs gaunate.

 $ rake dummy_data:test["users: 100 friends: 50 colour: red"] [["users", "100"], ["friends", "50"], ["colour", "red"]] # options are regexed into a 2d array {"users"=>"100", "friends"=>"50", "colour"=>"red"} # options are in a hash with keys as strings {:users=>"100", :friends=>"50", :colour=>"red"} # options are in a hash with symbols {:users=>"100", :friends=>"50", :colour=>"red", :name=>"tom"} # default option values are merged into options 
0
12 мая '17 в 4:05 2017-05-12 04:05 atsakymas pateikiamas xander.miller gegužės 12 d., 17 d., 04:05 2017-05-12 04:05

Perkeldami parametrus, geriausias variantas yra įvesties failas, ar tai gali būti „Excel“ „Json“ ar bet ko, ko jums reikia, ir iš ten perskaitykite reikiamą duomenų struktūrą ir kintamuosius, įskaitant kintamojo pavadinimą. Jei norite skaityti failą, gali būti ši struktūra.

  namespace :name_sapace_task do desc "Description task...." task :name_task => :environment do data = ActiveSupport::JSON.decode(File.read(Rails.root+"public/file.json")) if defined?(data) # and work whit yoour data, example is data["user_id"] end end 

Jsono pavyzdys

 { "name_task": "I'm a task", "user_id": 389, "users_assigned": [389,672,524], "task_id": 3 } 

Vykdymas

 rake :name_task 
-4
27 февр. atsakymas suteiktas tundervirld 27 vasario mėn 2014-02-27 16:52 '14 at 16:52 2014-02-27 16:52