Мне нравится синтаксис querystring для передачи аргументов, особенно когда нужно передать много аргументов.
Пример:
rake "mytask[width=10&height=20]"
Строка запроса:
width=10&height=20
Предупреждение: обратите внимание, что синтаксис: rake "mytask[foo=bar]"
и NOT rake mytask["foo=bar"]
При анализе внутри задачи rake с использованием Rack::Utils.parse_nested_query
мы получаем Hash
:
=> {"width"=>"10", "height"=>"20"}
(классно то, что вы можете передавать хэши и массивы, подробнее ниже)
Вот как этого добиться:
require 'rack/utils'
task :mytask, :args_expr do |t,args|
args.with_defaults(:args_expr => "width=10&height=10")
options = Rack::Utils.parse_nested_query(args[:args_expr])
end
Вот более расширенный пример, который я использую с Rails в моем delayed_job_active_record_threaded gem:
bundle exec rake "dj:start[ebooks[workers_number]=16&ebooks[worker_timeout]=60&albums[workers_number]=32&albums[worker_timeout]=120]"
Анализируется так же, как и выше, с зависимостью от среды (для загрузки среды 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
Дает следующее в options
=> {"ebooks"=>{"workers_number"=>"16", "worker_timeout"=>"60"}, "albums"=>{"workers_number"=>"32", "worker_timeout"=>"120"}}