我建议不要创建一般的调试和发布任务,如果项目真的是被编译的东西,因此会产生文件。正如您所说,您应该使用在您的示例中非常可行的文件任务,即您的输出进入不同的目录。假设您的项目只是使用 gcc 将 test.c 文件编译为 out/debug/test.out 和 out/release/test.out,您可以像这样设置您的项目:
WAYS = ['debug', 'release']
FLAGS = {}
FLAGS['debug'] = '-g'
FLAGS['release'] = '-O'
def out_dir(way)
File.join('out', way)
end
def out_file(way)
File.join(out_dir(way), 'test.out')
end
WAYS.each do |way|
desc "create output directory for #{way}"
directory out_dir(way)
desc "build in the #{way}-way"
file out_file(way) => [out_dir(way), 'test.c'] do |t|
sh "gcc #{FLAGS[way]} -c test.c -o #{t.name}"
end
end
desc 'build all ways'
task :all => WAYS.map{|way|out_file(way)}
task :default => [:all]
此设置可以像这样使用:
rake all # (builds debug and release)
rake debug # (builds only debug)
rake release # (builds only release)
这比要求的要多一点,但显示了我的观点:
- 根据需要创建输出目录。
- 仅在需要时才重新编译文件(此示例仅适用于最简单的 test.c 文件)。
- 如果您想触发发布构建或调试构建,您可以轻松完成所有任务。
- 这个例子包括一种方法来定义调试和发布版本之间的细微差别。
- 无需重新启用使用全局变量参数化的构建任务,因为现在不同的构建具有不同的任务。构建任务的代码重用是通过重用代码来定义构建任务来完成的。看看循环如何不执行两次相同的任务,而是创建任务,以后可以触发(通过 all-task 或在 rake 命令行上选择其中一个)。