Как передать массив в качестве аргумента для задачи Rake?
Я пишу задачу Rake, и я хочу передать массив как один из аргументов. Вот как я его сейчас.
task :change_statuses, :ids, :current_status, :new_status do |task, args|
puts "args were #{args.inspect}"
end
Я попытался выполнить задачу следующими способами:
# First argument as array
rake "change_statuses[[1,2,3], active, inactive]"
# First argument as string
rake "utility:change_account_statuses['1,2,3', foo, bar]"
Мой ожидаемый вывод:
args were {:ids=> [1,2,3], :current_status=> 2 , :new_status=> 3}
Однако мой фактический вывод в каждом случае:
args were {:ids=>"[1", :current_status=>"2", :new_status=>"3]"}
Как передать массив в задачу Rake?
Ответы
Ответ 1
Одна из причин состоит в том, чтобы избежать символа ,
в строке, поэтому ваша командная строка будет выглядеть так:
$ rake change_statuses['1 2 3', foo, bar]
Затем вы можете просто разделить идентификаторы:
# Rakefile
task :change_statuses, :ids, :current_status, :new_status do |task, args|
ids = args[:ids].split ' '
puts "args were #{args.inspect}"
puts "ids were #{ids.inspect}"
end
Или вы можете проанализировать значение ids для получения ожидаемого результата:
args[:ids] = args[:ids].split(' ').map{ |s| s.to_i }
Я использую рейк 0.8.7
Ответ 2
rake "change_statuses[1 2 3, foo, bar]"
это работает для меня, вы не должны использовать квоту 1 2 3 с помощью
task :import_course, [:cids, :title] => :environment do |t, args|
puts args[:cids]
end
если в качестве правильного ответа вы укажете 1 2 3, args [: cids] будет "1 2 3", в который включен '
char, вы должны обрезать '
char, но если вы используете мой ответ, args [: cids] будет "1 2 3", что проще в использовании, вам просто нужны аргументы [: cids].split(""), чтобы получить [1, 2, 3]
Ответ 3
Еще один способ добиться этого, а также выиграть способность передавать хэш
namespace :stackoverflow do
desc "How to pass an array and also a hash at the same time 8-D"
task :awesome_task, [:great_attributes] do |task, args|
options = Rack::Utils.parse_nested_query(args[:attributes])
puts option
end
end
И просто вызовите грабли следующим образом:
bundle exec rake "player_rules:awesome_task[what_a_great_key[]=I know&what_a_great_key[]=Me too\!&i_am_a_hash[and_i_am_your_key]=what_an_idiot]"
И это напечатает
{"what_a_great_key"=>["I know", "Me too!"], "i_am_a_hash"=>{"and_i_am_your_key"=>"what_an_idiot"}}
Ответ 4
Вы можете сделать это как альтернативу:
task :my_task, [:values] do |_task, args|
values = args.values.split(',')
puts values
end
и запустите задачу, используя
rake my_task"[1\,2\,3]"