2011-04-20 65 views
19

我看到的例子,其中一个任务都有参数和依赖的任务,如:如何声明取决于参数化任务的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 

回答

21

ARG游戏通过调用堆栈传递下去。您只需确保您的顶级任务捕获所有依赖关系所需的所有参数。在你的情况,你会希望把first_namelast_namesend_letter任务。

这是一个示例,显示了在别处流入依赖项的命名参数(即使它们未在依赖项中定义),但与顶级任务参数的名称不匹配的参数是零。

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]

+1

谢谢你,有很大的帮助。但是,我希望上帝的幻想变量会死亡,好的创造性例子会回来。 – 2017-03-16 15:43:50

7

您可能会得到最接近的是

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只要求如果它没有被称为任务,首先调用任何多余prereqs。 Task#execute始终调用任务,但不调用任何前提条件。请注意,这些参数不影响Task#invoke呼叫一次性质:如果你调用一个参数化任务的两倍,它只会得到一次运行的参数是否是不同的。