如何声明依赖于参数化任务的Rake任务?

时间:2011-04-20 21:20:48

标签: ruby rake rake-task

我见过一个例子,其中一个任务有参数和一个依赖任务,如:

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

2 个答案:

答案 0 :(得分:29)

Args通过调用堆栈向下传递。您只需要确保您的顶级任务捕获所有依赖项所需的所有参数。在您的情况下,您需要将first_namelast_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版本:ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]

答案 1 :(得分:8)

你最接近的可能是

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的一次调用性质:如果您两次调用参数化任务,它将只运行一次,无论参数是否不同。