如何声明一个依赖于带参数任务的Rake任务?

31

我曾看到过一些任务具有参数和依赖任务,例如:

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个回答

33

参数通过调用栈传递。您只需要确保顶级任务捕获所有依赖项所需的参数。在您的情况下,您将想要将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

值得注意的是,在foo任务中使用args.with_defaults(nom: 'Jaques')对依赖任务没有影响--nom仍然为nil。

Rake版本:rake,版本10.0.3

Ruby版本:ruby 1.9.3p125(2012-02-16修订版34643)[x86_64-darwin11.3.0]


1
谢谢,非常有帮助。但愿元语法变量能够消失,好的创意示例能够回归。 - William Entriken
元语法变量是什么,或者说,你指的是上面哪一个? - Sixtyfive
我能看出来,预设值不能被传递,因为依赖项会在 with_defaults 调用之前运行。但是,除了为每个默认值提取一个常量并手动确保所有使用该参数的依赖任务中都有 with_defaults 调用 (或者对于所有默认值都调用帮助函数),是否有其他好的方法来实现这一目标? - Sam Brightman
with_defaults 不会改变 args,而 with_defaults! 会。但是,是的,它会在先决条件之后执行。 - x-yuri

9
您可能会得到的最接近的答案是:
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")

但是这将不管你是否需要调用sendLetter, 都会调用name

Task#invoke只有在任务未被调用时才调用该任务,并首先调用所有未被调用的先决任务。Task#execute始终调用任务,但不会调用任何先决任务。请注意,参数不会影响Task#invoke的一次性调用特性:如果您两次调用参数化任务,则无论参数是否不同,它都仅会运行一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接