Rake

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

另请参阅

 Make
 Apache Maven
 Apache Ant

 外部链接 
 Rake文档

 由马丁·福勒撰写的使用Rake构建语言 
 railsenvy.com上的Ruby on Rails Rake教程 
 railscasts.com上的自定义Rake任务
 lukaszwrobel.pl上的Rake教程

Category:程序设计工具
Category:自动化构建
Category:使用MIT许可证的软件
Category:Ruby