Как вы объявляете задачу Rake, которая зависит от параметризованной задачи?
Я видел примеры, когда задача имеет параметры и задачу зависимости, например:
task :name, [:first_name, :last_name] => [:pre_name] do |t, args|
args.with_defaults(:first_name => "John", :last_name => "Dough")
puts "First name is #{args.first_name}"
puts "Last name is #{args.last_name}"
end
Как бы вы передавали параметры в задачу имя, если она была зависимой от задачи, например:
task :sendLetter => :name
#do something
end
Ответы
Ответ 1
Арги передаются через стек вызовов. Вам просто нужно убедиться, что ваша задача на верхнем уровне содержит все аргументы, необходимые для всех зависимостей. В вашем случае вам нужно поставить first_name
и last_name
в задачу send_letter
.
Вот пример, который показывает именованные аргументы, определенные в другом месте, входящие в зависимость (даже если они не определены в зависимости), но аргумент, который не соответствует имени аргумента задачи верхнего уровня, равен nil.
desc 'Bar'
task :bar, :nom do |task, args|
puts "BAR NOM: #{args[:nom]}"
puts "BAR NAME: #{args[:name]}"
end
desc 'Foo'
task :foo, [:name] => :bar do |task, args|
puts "FOO NAME: #{args[:name]}"
end
Запуск rake foo[baz]
yeilds
BAR NOM:
BAR NAME: baz
FOO NAME: baz
Интересно отметить, что использование args.with_defaults(nom: 'Jaques')
в задаче foo
не влияет на зависимую задачу - nom
по-прежнему отсутствует.
версия рейка: rake, version 10.0.3
Ruby version: ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]
Ответ 2
Ближе всего вы, вероятно, получите либо
task :sendLetter do
task(:name).invoke("first", "last")
end
или
task :sendLetter do
task(:name).execute(["first", "last"])
end
Вы можете сделать что-то вроде
task :sendLetter => task(:name).invoke("first", "last")
но будет вызывать name
независимо от того, запрашиваете ли вы sendLetter
или нет.
Task#invoke
вызывает вызов только в том случае, если он не был вызван и сначала вызывает любые невостребованные предварительные условия. Task#execute
всегда вызывает задачу, но не вызывает никаких предварительных условий. Обратите внимание, что параметры не влияют на характер вызова Task#invoke
: если вы дважды вызываете параметризованную задачу, она будет запускаться только один раз, независимо от того, являются ли параметры разными.