2010-02-26 35 views
14

假設我有一個需要編譯一些文件的目標。該目標有另一個目標作爲先決條件,獲取文件。 讓我們這樣說:你如何在Rake任務之間進行通信?

task :obtain do 
    # obtain files from somewhere 
end 

task :compile => :obtain do 
    # do compilation 
end 

讓我們說,:obtain目標並不總是放在同一個文件夾中的文件。我如何通過:compile:obtain找到的路徑?環境變量?

回答

13

使用ENV [「東西」]在我看來是最好的,因爲如果你這樣做這樣(而不是$ global或@instance變量),您可以將它們視爲任務參數,並輕鬆使用命令行中的子任務。另一方面,如果您將代碼保存在單獨的類/模塊/方法中,那麼您甚至不必處理這些類型的黑客攻擊+您的代碼將更具可測試性。

+0

是的。這就是我最終做到的。謝謝! – Geo 2010-02-28 19:43:36

+0

應該牢記的是,ENV只能將字符串作爲鍵和值,所以儘管這種限制在文件名中可能不重要,但在處理其他類型的值時可能不是一個好的解決方案。 – Dologan 2017-01-20 11:56:38

10

一種方法是將其存儲在一個全局變量:

task :obtain do 
    $obtained_dir = "/tmp/obtained" 
end 

task :compile => :obtain do 
    puts "compiling files in #{$obtained_dir}" 
end 

實例變量(即@obtained_dir)也應該工作。

另一種方式是拉「取得」的代碼放到一個方法,如下所示:

task :obtain do 
    obtain_files 
end 

task :compile do 
    obtained_dir = obtain_files 
    puts "compiling files in #{obtained_dir}" 
end 

def obtain_files 
    #obtain files from somewhere 
    "/tmp/obtained_files" 
end 
+1

+1爲了實現這個方法。任務:獲得似乎不是它的任務,它只是其他人所稱的方法。 – 2011-09-19 09:17:18

相關問題