Rake
開發者 | Jim Weirich |
---|---|
當前版本 | 12.3.0(2017年11月15日 | )
源代碼庫 | |
編程語言 | Ruby |
操作系統 | Cross-platform |
類型 | Software development tools |
許可協議 | MIT License |
網站 | ruby |
Rake是一款軟件任務管理及組建自動化工具。用戶可指定任務、描述依賴關係及分組命名空間中的任務。
此軟件與SCons和Make類似,但有着諸多差異。Rake使用Ruby編寫,使用以Ruby語法編寫的Rakefile(與Make中的Makefile等同)。此軟件由吉姆·韋里奇編寫。
Rake使用Ruby的匿名函數塊來定義多個任務並允許用戶使用Ruby語法。它擁有共同任務庫,例如:控制文件任務的函數及移除已編譯文件(即「clean」任務)的庫。與Make相似的是,Rake同樣可以根據模式來合成任務,例如:根據文件名自動構建文件編譯任務。Rake現已成為Ruby 1.9後標準庫的一部分。
示例
下方是一個簡單的用於構建C語言 「Hellow, world!」程序的Rake腳本。
file 'hello.o' => 'hello.c' do
sh 'cc -c -o hello.o hello.c'
end
file 'hello' => 'hello.o' do
sh 'cc -o hello hello.o'
end
要查看更多示例,請參見Rakefile 文件格式(頁面存檔備份,存於網際網路檔案館)文檔。
規則
當文件被列為先決條件但不含有為其定義的文件任務時,Rake將嘗試通過查看Rakefile所支持的規則列表來合成任務。例如,假設我們嘗試調用任務"我的代碼.o"卻不為其定義任務,且Rakefile規則如下所示:
rule '.o' => '.c' do |t|
sh "cc #{t.source} -c -o #{t.name}"
end
此規則將自動合成任意以「.o」為後綴名的任務。前提條件是必須存在拓展名為「.c」的源文件。若Rake可以找到名為「我的代碼.c」的源文件,其將自動新建任務將「我的代碼.c」構建為「我的代碼.o」。若文件「我的代碼.c」不存在,Rake將嘗試為其遞歸合成規則。
當任務從規則中合成後,任務的原屬性被設置為匹配源文件。這點使得用戶可撰寫含引用源文件操作的規則。
高級規則
任意正則表達式均可作為規則模式。除此之外,進程也可用於計算源文件名稱以允許複雜的模式及源。
下方規則與上方示例等同:
rule(/\.o$/ =>
->(t_name){ t_name.sub /\.o$/, '.c' }) do |t|
sh "cc #{t.source} -c -o #{t.name}"
end
請注意:根據Ruby語法習慣,當首個參數為正則表達式時需要在規則旁插入括號。
下列規則可用於Java文件:
rule '.class' => ->(t_name){ t_name
.sub(/\.class$/, '.java')
.sub(/^classes\//, 'src/') } do |t|
java_compile(t.source, t.name)
end
下方是個簡單的Rake合成配方示例:
namespace :cake do
desc '做煎饼馃子'
task :pancake => [:egg,:mianhu,:conghua,:baking_powder] do
puts "凉油"
end
task :mianhu do
puts "放上凉面糊推成圆饼型"
end
task :egg => :mianhu do
puts "打上1{{frac|1|2}}个鸡蛋"
end
task :conghua do
puts "放上1{{frac|1|4}}勺葱花"
end
task :egg do
puts "打上1个鸡蛋"
end
task :qiguo do
puts "铲起大饼打包"
end
end