我有一个Rakefile,它根据全局变量$build_type
以两种方式编译项目,可以是:debug
或:release
(结果放在不同的目录中):< / p>
task :build => [:some_other_tasks] do
end
我希望创建一个任务,依次使用两种配置编译项目,如下所示:
task :build_all do
[ :debug, :release ].each do |t|
$build_type = t
# call task :build with all the tasks it depends on (?)
end
end
有没有办法将任务称为方法?或者我怎样才能实现类似的目标呢?
答案 0 :(得分:617)
task :build => [:some_other_tasks] do
build
end
task :build_all do
[:debug, :release].each { |t| build t }
end
def build(type = :debug)
# ...
end
rake
的习语,那么根据过去的答案编译你的可能性:这总是执行任务,但它不执行其依赖项:
Rake::Task["build"].execute
这个执行依赖项,但只执行任务if 它尚未被调用:
Rake::Task["build"].invoke
首先重置任务的already_invoked状态,允许任务执行 然后再次执行,依赖和所有:
Rake::Task["build"].reenable
Rake::Task["build"].invoke
(请注意,已经调用的依赖项不会被重新执行)
答案 1 :(得分:117)
例如:
Rake::Task["db:migrate"].invoke
答案 2 :(得分:55)
task :build_all do
[ :debug, :release ].each do |t|
$build_type = t
Rake::Task["build"].reenable
Rake::Task["build"].invoke
end
end
那应该把你排除在外,我自己也需要同样的东西。
答案 3 :(得分:11)
task :build_all do
[ :debug, :release ].each do |t|
$build_type = t
Rake::Task["build"].execute
end
end
答案 4 :(得分:6)
task :invoke_another_task do
# some code
Rake::Task["another:task"].invoke
end
答案 5 :(得分:3)
如果您希望每个任务都能运行而不管任何失败,您可以执行以下操作:
task :build_all do
[:debug, :release].each do |t|
ts = 0
begin
Rake::Task["build"].invoke(t)
rescue
ts = 1
next
ensure
Rake::Task["build"].reenable # If you need to reenable
end
return ts # Return exit code 1 if any failed, 0 if all success
end
end
答案 6 :(得分:-1)
如果项目真的是被编译的结果,那么我建议不要创建一般的调试和发布任务。您应该使用在您的示例中非常可行的文件任务,如您所述,您的输出将进入不同的目录。 假设您的项目只是使用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)
这有点像要求的那样,但显示了我的观点: