Rake是一款软件任务管理及組建自動化工具。用户可指定任务、描述依赖关系及分组命名空间中的任务。

Rake
開發者Jim Weirich英语Jim Weirich
当前版本12.3.0(2017年11月15日,​7年前​(2017-11-15
源代码库 編輯維基數據鏈接
编程语言Ruby
操作系统Cross-platform
类型Software development tools
许可协议MIT License
网站ruby.github.io/rake/

此软件与SConsMake类似,但有着诸多差异。Rake使用Ruby编写,使用以Ruby语法编写的Rakefile(与Make中的Makefile等同)。此软件由吉姆·韦里奇英语Jim Weirich编写。

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

另请参阅

外部链接