2008-09-18 29 views
4

我最近開始使用Rake構建一些我的(非紅寶石)包。 Rake很好,但我發現缺少的是一種分層構建(在子目錄中聚集Rakefiles)的方法。由於這是大多數其他構建工具的常見功能,所以我想知道是否有人更熟悉Rake有一個好的解決方案。如何用rake做分層構建?

回答

2

我會爲非Ruby構建任務推薦Buildr。它基於Rake(位於它的頂部,允許您使用Rake的所有功能),但更符合編譯語言的語義。它也支持分層構建。

1

我也想不出辦法做到這一點。我結束了:

SUBDIR = "subdir" 
task :subtask => SRC_FILES do |t| 
    chdir(SUBDIR) do 
     system("rake") 
    end 
end 

task :subtaskclean do |t| 
    chdir(SUBDIR) do 
     system("rake clean") 
    end 
end 

task :subtaskclean do |t| 
    chdir(SUBDIR) do 
     system("rake clobber") 
    end 
end 

task :default => [:maintask, :subtask] 
task :clean => :subtaskclean 
task :clobber => :subtaskclobber 

有點爛。其實,真的很糟糕。我走遍了文檔,但沒有找到的<antcall>

我敢肯定,因爲這一切都Ruby和我勉強瞭解Ruby還有的require荷蘭國際集團,或一些東西超明顯的方式等同。

+0

紅寶石需求不起作用,因爲它不會改變工作目錄。我一直沒能找到任何支持這種遞歸行爲的ruby原語。 – 2015-05-01 22:37:49

1

Buildr使用範圍的概念,再加上項目的名稱。

Rake.application.current_scope應該是發現如何使用它們的入口點。我希望這有幫助。

0

我用來解決這個問題的解決方法是:

Dir.chdir(File.dirname(Rake.application.rakefile)) 

此語句在除了根層級層層運行,在每個Rake文件的開始。這是如何縮短的例子工程實踐:

/Rake文件:

task :default do 
    sh "rake -f component/rakefile" 
end 

/組件/ Rake文件

Dir.chdir(File.dirname(Rake.application.rakefile)) 

task :binary => OBJECTS do 
    sh "gcC#{SOURCES} -Iinclude -o #{TARGET}" 
end 

由於我是新來耙,我不相信這是最乾淨的解決它的方法,但它是我最終如何運作的。