Rake是一款软件任务管理及组建自动化工具。用户可指定任务、描述依赖关系及分组命名空间中的任务。
开发者 | Jim Weirich |
---|---|
当前版本 | 12.3.0(2017年11月15日 | )
源代码库 | |
编程语言 | Ruby |
操作系统 | Cross-platform |
类型 | Software development tools |
许可协议 | MIT License |
网站 | ruby |
此软件与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
另请参阅
外部链接
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.