Rake komanda üçün command line argümanlarını necə keçmək olar

Bir neçə verilənlər bazasına bir dəyər əlavə etməsi lazım olan bir rake tapşırıq var.

Komanda xəttindən və ya başqa bir rake vəzifəsindən rake əmrinə bu dəyəri vermək istərdim.

Bunu necə edə bilərəm?

898
05 мая '09 в 19:27 2009-05-05 19:27 Tılendor 05 may 09: 19-da saat 19: 27-da yaradılmışdır
@ 17 cavab

Parametrlər və bağımlılıqlar dizilərin içərisində olmalıdır:

 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 

Sonra

 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"} 

Qeyd: dəyişən t task üçün uyğun deyil. Nə etdiyinizi bilmirsinizsə, bu, bir məsələ obyektidir, çox faydalı deyil.

166
08 апр. Blair Anderson tərəfindən verilmiş cavab Apr 08 2015-04-08 00:56 '15 at 0:56 2015-04-08 00:56

Vəzifə çağırışına xarakterli arqumentlər əlavə edərək grafiğe formal arqumentləri təyin edə bilərsiniz. Məsələn:

 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 

Sonra əmr xəttindən:

 > rake my_task [1,2] Args idi: {: arg1 => "1" ,: arg2 => "2"} > rake "my_task [1, 2]" Args idi: {: arg1 => "1" ,: arg2 => "2"} > rake invoke_my_task Args idi: {: arg1 => "1" ,: arg2 => "2"} > rake invoke_my_task_2 Args idi: {: arg1 => 3 ,: arg2 => 4} > rake with_prerequisite [5,6] Args idi: {: arg1 => "5" ,: arg2 => "6"} > ilə rake with_defaults Varsayılan args: {: arg1 =>: default_1 ,: arg2 =>: default_2} > rake with_defaults ['x', 'y'] Əvvəlcədən təyin olunmuş Args: {: arg1 => "x" ,: arg2 => "y"}
border=0

İkinci misalda göstərildiyi kimi, boşluqlardan istifadə etmək istəyirsinizsə, hədəf adının ətrafındakı quotes zəruri olur, belə ki, qəfəs kosmosda dəlilləri ayırmamalıdır.

Rake.rb kodunu nəzərə alaraq, tırtıl əvvəlcədən şərtləri arqumentlər çıxarmaq üçün vəzifə stringsini ayırmır, belə ki, task :t1 => "dep[1,2]" edə bilməzsiniz task :t1 => "dep[1,2]" . Ön şərt üçün müxtəlif arqumentləri müəyyənləşdirmək üçün yeganə yol, :invoke_my_task:invoke_my_task_2 kimi, asılı olaraq, asılı məsələ daxilində onu :invoke_my_task_2 .

Bəzi kabuklar (zsh kimi) sizin üçün braces tələb edir: rake my_task\['arg1'\]

1054
05 мая '09 в 19:45 2009-05-05 19:45 Nick Desjardinsə cavab 05.05 09:45 saat 19: 45-da 2009-05-05 19:45

Kç cavabına əlavə olaraq (bu barədə bir şərh vermək üçün nə etməliyəm, üzr istəyirəm):

rake əmrindən əvvəl dəyişənləri ENV dəyişənləri kimi təyin etmək lazım deyil. Siz sadəcə adi komanda parametrləri kimi təyin edə bilərsiniz:

 rake mytask var=foo 

və bunları sizin rake faylınızdan ENV dəyişənləri kimi əldə edin, məsələn:

 p ENV['var'] # => "foo" 
260
19 февр. cavab 19 fevralda timurb tərəfindən verilir 2011-02-19 14:05 '11 saat 14:05 'da 2011-02-19 14:05

OptionParser arqumentləri qəbul etmək istəyirsinizsə (məsələn, standart OptionParser ) belə bir şey istifadə edə bilərsiniz:

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

qeyd edin -- standart rake arqumentlərini atlatmaq lazımdır. Rake 0.9.x , <= 10.3.x ilə işləməlidir.

Daha yeni Rake öz təhlilini dəyişdi -- və indi, OptionParser#parse , məsələn, parser.parse!(ARGV[2..-1]) istifadə edərək, 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 

Sonda exit əlavə arqumentlərin rake vəzifəsi kimi şərh edilməyəcəyinə əmin olun.

Arqumentlər üçün bir qısa yol da olmalıdır:

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

Rake ssenarilərinə bənzərsə, onu qutudan çıxara biləcək bir vasitə axtarmağın vaxtı ola bilər.

84
19 окт. cavab 19 oktyabr Tombart verilir . 2013-10-19 16:09 '13 at 4:09 pm 2013-10-19 16:09

Bu iki saytın cavabını tapdım: Net ManiacAimred .

Bu texnikadan istifadə etmək üçün versiyaya> 0.8 tırmağa ehtiyacınız olacaq

Tökmə vəzifəsinin normal təsviri:

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

Mübahisələrə keçmək üçün üç addımı izləyin:

  • Vəzifə adından sonra vergüllə ayrılan dəlil adları əlavə edin.
  • Bağımlılıkları sonuna qoyun: needs => [...]
  • Yeri | t, args | bunu etdikdən sonra. (t bu vəzifənin obyektidir)

Ssenaridə olan arqumentlərə çatmaq üçün args.arg_name istifadə edin

 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 

Komanda xəttindən bu tapşırıq çağırmaq üçün, argumentlərə [] s daxil edin

 rake task_name['Hello',4] 

göstərir

 Hello Hello Hello Hello 

və bu vəzifəni başqa bir vəzifədən çağırmaq və onun arqumentlərini ötürmək istəyirsinizsə, istifadə edin

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

sonra komanda

 rake caller 

göstərir

 In Caller hi hi 

Bağımlılığın bir hissəsi olaraq arqumentləri keçməyə bir yol tapmadım, çünki aşağıdakı kod pozulur:

 task :caller => :task_name['hi',2]' do puts 'In Caller' end 
54
05 мая '09 в 19:51 2009-05-05 19:51 May 05 '09 da saat 19:51 'da Tilendor'a cavab verdi 2009-05-05 19:51

Digər geniş istifadə olunan variant ətraf mühit dəyişənlərindən keçir. ENV['VAR'] onları ENV['VAR'] vasitəsilə oxuyursunuz və bunları rake əmrindən əvvəl, məsələn,

 $ VAR=foo rake mytask 
29
05 мая '09 в 19:53 2009-05-05 19:53 cavab 05 may '09 saat 19:53 'da verilmişdir 2009-05-05 19:53

Əslində, @Nick Desjardins mükəmməl cavab verdi. Amma yalnız təhsil üçün: çirkli yanaşmadan istifadə edə bilərsiniz: ENV arqumentini istifadə edin

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

Mən arqumentləri, habelə mühitin necə çatdırılacağını başa düşmədim: bunu başa çatana qədər:

 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 

Və sonra bunu deyirəm:

 rake db:export['foo, /tmp/'] 
23
29 нояб. Cavab Nate Flink tərəfindən 29 noyabrda verilir. 2014-11-29 22:38 '14 at 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 окт. cavab 16 oktyabrda Feng tərəfindən verilir . 2012-10-16 10:36 '12 saat 10:36 'da 2012-10-16 10:36

Rake faylında adi ruby ​​arqumentini istifadə edirəm:

 DB = ARGV[1] 

sonra dosyanın altındakı rake vəzifələrini silmək (tökmə bu dəlil adına əsaslanan vəzifəni axtarmaq kimi).

 task :database_name1 task :database_name2 

:

 rake mytask db_name 

mənim üçün var = foo ENV var və vəzifələri args [blah, blah2] daha təmiz olur.
Yalnız bir dəfə parametrlər olan bir neçə mühitə malik olduğunuz halda, çox pis deyil

12
29 дек. Cavab djburdick 29 dekabrda verilir. 2012-12-29 05:48 '12 at 5:48 2012-12-29 05:48

Mən yalnız çalıştırmak istedim:

 $ rake some:task arg1 arg2 

Sadə, deyil? (Nope!)

Rake, arg1arg2 vəzifələr olaraq şərh arg1 və onları başlamaq üçün çalışır. Buna görə də biz bundan əvvəl işimizi dayandırırıq.

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

Alın, mötərizə!

Disclaimer . Mən bunu kiçik bir ev layihəsində edə bilmək istədi. Real dünyada istifadə üçün nəzərdə tutulmayıb, rake task1 task2 task3 vəzifələrini (yəni, rake task1 task2 task3 ) rake task1 task2 task3 . IMO buna dəyər deyil. Yalnız çirkin rake task[arg1,arg2] istifadə edin rake task[arg1,arg2] .

9
29 апр. cavab verildi jassa 29 Apr 2016-04-29 06:29 '16 'da 6:29' də 2016-04-29 06:29

Dəlilin ötürülməsi yolu yuxarıda verilən cavabda düzgündür. Buna baxmayaraq, tiraj vəzifəsini arqumentlər ilə idarə etmək üçün relslərin yeni versiyası ilə bağlı kiçik bir texniki problem var

Rak ilə işləyəcək "ad boşluğu: taskname ['argument1']"

Komanda xəttindən bir vəzifəyə başlama zamanı ters quotes qeyd edin.

4
24 апр. Cavab 24 aprel tarixində Asim Mushtaq tərəfindən verilmişdir 2014-04-24 17:23 '14 at 17:23 2014-04-24 17:23

Xüsusən, qəbul edilməli olan bir çox arqumentlər olduğunda, argumentlərin keçməsi üçün "querystring" sözdizimini sevirəm.

Məsələn:

 rake "mytask[width=10> 

"querystring":

 width=10> 

Xəbərdarlıq: sözdizim rake "mytask[foo=bar]"rake mytask["foo=bar"]

Rack::Utils.parse_nested_query ilə rake tapşırığını təhlil edərkən Rack::Utils.parse_nested_query bir Hash almaq:

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

(Hissələri və dizilərindən daha aşağıda keçə bilərik)

Bunu necə etmək olar:

 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 

Gecikmiş_job_active_record_threaded gemdə Rails ilə istifadə etdiyim daha inkişaf etmiş bir nümunə:

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

Ətraf mühiti asılılığı ilə (Rails mühitini yükləmək üçün)

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

options aşağıdakıları verir

 => {"ebooks"=>{"workers_number"=>"16", "worker_timeout"=>"60"}, "albums"=>{"workers_number"=>"32", "worker_timeout"=>"120"}} 
2
17 февр. Cavab 17 fevralda Abdo tərəfindən verilir. 2014-02-17 01:05 '14 'da 1:05 2014-02-17 01:05

Müvəkkilləri default işə keçmək üçün belə bir şey edə bilərsiniz. Məsələn, deyək "Version" sizin arqumentinizdir:

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

Sonra belə bir şəkildə zəng edə bilərsiniz:

 $ rake no version passed 

və ya

 $ rake default[3.2.1] version is 3.2.1 

və ya

 $ rake build[3.2.1] version is 3.2.1 

Buna baxmayaraq, arqumentlərdən keçərkən vəzifənin adını (default və ya quruluş) müəyyənləşdirməkdən qaçınmaq üçün bir yol tapmadım. Bu barədə hər kəsin bildiyini eşitmək istərdim.

2
20 окт. Cavab 20 İldə Gal verilir . 2013-10-20 22:03 '13 saat 10:03 'da 2013-10-20 22:03

Yuxarıda təsvir olunan üsulların əksəriyyəti mənim üçün işləmir, onlar yeni versiyalarda köhnəlmiş ola bilər. Son təlimat burada tapa bilərsiniz: http://guides.rubyonrails.org/command_line.html#custom-rake-tasks

dərslikdən surəti və yapışdırıb:

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

Bunu belə çağırın

 bin/rake "task_name[value 1]" # entire argument string should be quoted 
1
03 февр. cavab hexinpeter verildi 03 fevral. 2015-02-03 04:15 '15 'də 4:15' də 2015-02-03 04:15

Əgər arqumentin mövqeyi nə üçün narahatlıq doğurursa və bir ruby ​​arqumenti hash kimi bir şey etmək istəyirsənsə. Bir dize keçmək üçün bir arqument istifadə edə bilərsiniz və sonra bu simli bir karma rejimində təkrar istifadə edə bilərsiniz.

 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 

Və əmr xəttində olsun.

 $ 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 cavab xander.miller 12 May '17 'də 4:05 2017-05-12 04:05' də verilir

Parametrlər köçürdüyündə, ən yaxşı seçim giriş faylıdır, json excel ola bilər və ya lazım ola biləcək hər hansı bir şeydir və lazım olan dəyişiklərin adını da daxil olmaqla, lazım olan məlumat strukturu və dəyişənləri oxumaq olar. Dosyayı oxumaq üçün aşağıdakı quruluş ola bilər.

  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 

Json nümunəsi

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

İcra

 rake :name_task 
-4
27 февр. Cavab tundervirld verildi Feb 27 2014-02-27 16:52 '14 'da 16:52 2014-02-27 16:52

etiketləri haqqında digər suallar və ya bir sual verin