Как вы объявляете задачу Rake, которая зависит от параметризованной задачи? - PullRequest
26 голосов
/ 21 апреля 2011

Я видел примеры, где задача имеет параметры и задачу зависимости, такую ​​как:

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

Как бы вы передавали параметры в задачу name , если бы это была зависимость задачи, такая как:

task :sendLetter => :name
  #do something
end

Ответы [ 2 ]

29 голосов
/ 14 февраля 2013

Аргументы передаются через стек вызовов. Вам просто нужно убедиться, что ваша задача верхнего уровня захватывает все аргументы, необходимые для всех зависимостей. В вашем случае вы захотите поместить 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] урожай

BAR NOM: 
BAR NAME: baz
FOO NAME: baz

Интересно отметить, что использование args.with_defaults(nom: 'Jaques') в задаче foo не влияет на зависимую задачу - nom по-прежнему равен нулю.

Версия рейка: rake, version 10.0.3

Рубиновая версия: ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]

8 голосов
/ 10 июля 2011

Ближайшее, что вы, вероятно, получите, это либо

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: если вы вызываете параметризованную задачу дважды, она запускается только один раз, независимо от того, отличаются ли параметры.

...