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