如何声明依赖于参数化任务的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 

如果它是一个任务依赖项,你将如何将参数传递给name任务:

 task :sendLetter => :name #do something end 

Args通过调用堆栈向下传递。 您只需要确保您的顶级任务捕获所有依赖项所需的所有参数。 在您的情况下,您将要在send_letter任务上放置first_namelast_name

下面是一个示例,显示在其他地方定义的命名参数流入依赖项(即使它们未在依赖项中定义),但与顶级任务参数名称不匹配的参数为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 

有趣的是,在foo任务中使用args.with_defaults(nom: 'Jaques')对依赖任务没有影响 – nom仍然是零。

耙版: rake, version 10.0.3

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

你可能会得到的最接近的是

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