Rake 的作用类似于C的make。用来定义和执行任务。它没有专门的语法,完全用ruby来写。
Task
一个任务包含:名称(String或Symbol),后面是一个数组(包含一些先决条件,即其他任务名)或一个block。
同一个任务可以定义多次,就好像这个任务是分成几部分定义一样,最终是各部分的合并。
task :name
task name: [:prereq1, :prereq2]
task name: %w[prereq1 prereq2]
task name: [:prereq1, :prereq2] do |t|
# actions (may reference t)
end
File task
文件任务通过以下文件来创建其他文件,即建立文件的依赖关系。它用 file 方法,而不是 task,任务名称是字符串。
# 通过 a.o 和 b.o 创建 prog 文件,创建的方法在 block 里。
file "prog" => ["a.o", "b.o"] do |t|
sh "cc -o #{t.name} #{t.prerequisites.join(' ')}"
end
Directory Tasks
目录任务是文件任务的一种快捷方式
directory "testdata/examples/doc"
# 等同于
file "testdata" do |t| mkdir t.name end
file "testdata/examples" => ["testdata"] do |t| mkdir t.name end
file "testdata/examples/doc" => ["testdata/examples"] do |t| mkdir t.name end
Rules
没有指定任务名称,而是规定任务名称的格式。如下面是形如xx.o的任务。
rule '.o' => ['.c'] do |t|
sh "cc #{t.source} -c -o #{t.name}"
end
Comments
除了ruby的注释外,可以使用 desc 来描述任务,这样就可以用 rake -T
来显示该任务了。
desc "Create a distribution package"
task package: %w[ ... ] do ... end
命名空间
namespace "main" do
task :build do
# Build the main program
end
end
namespace "samples" do
task :build do
# Build the sample programs
end
end
task build: %w[main:build samples:build]
Rakefile 文件可以分成多个文件放在 lib目录里,如rails的 lib/tasks
当你在项目目录里执行 rake 时,首先在当前目录查找 Rakefile 文件,如果没有会向上级目录查找
网友评论