2011-04-20 35 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呼叫一次性質:如果你調用一個參數化任務的兩倍,它只會得到一次運行的參數是否是不同的。