如何从Rake任务中运行Rake任务?
我有一个根据全局variables$build_type
编译项目的$build_type
,它可以是:debug
或:release
(结果放在不同的目录中):
task :build => [:some_other_tasks] do end
我希望创build一个任务,用两个configuration依次编译项目,如下所示:
task :build_all do [ :debug, :release ].each do |t| $build_type = t # call task :build with all the tasks it depends on (?) end end
有没有办法像调用方法一样调用任务? 或者我怎么能做到类似的事情?
如果你需要把这个任务当作一个方法,那么使用一个实际的方法怎么样?
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
-
这个执行依赖关系,但是它只执行任务,如果它尚未被调用:
Rake::Task["build"].invoke
-
这首先重置任务的already_invoked状态,允许任务再次执行,依赖关系和所有:
Rake::Task["build"].reenable Rake::Task["build"].invoke
(请注意,已经调用的依赖关系不会被重新执行)
例如:
Rake::Task["db:migrate"].invoke
task :build_all do [ :debug, :release ].each do |t| $build_type = t Rake::Task["build"].reenable Rake::Task["build"].invoke end end
这应该排除你,只需要自己同样的事情。
task :build_all do [ :debug, :release ].each do |t| $build_type = t Rake::Task["build"].execute end end
如果您希望每个任务都运行而不pipe任何失败,则可以执行如下操作:
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
我build议不要创build一般的debugging和发布任务,如果该项目是真正的东西被编译,所以导致文件。 在你的例子中,你应该使用在你的例子中相当可行的文件任务,你的输出进入不同的目录。 说你的项目只是编译一个test.c文件out / debug / test.out和out / release / test.out用gcc你可以像这样设置你的项目:
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)
这要求多一点,但显示了我的观点:
- 输出目录是根据需要创build的。
- 如果需要的话,这些文件只会被重新编译(这个例子只适用于最简单的test.c文件)。
- 如果要触发发布版本或debugging版本,您可以随时掌握所有任务。
- 这个例子包含了一个方法来定义debugging和发布版本之间的细微差别。
- 不需要重新启用一个用全局variables参数化的构build任务,因为现在不同的构build有不同的任务。 构build任务的codereuse是通过重用代码来定义构build任务完成的。 看看循环如何不执行两次相同的任务,而是创build任务,这些任务可以稍后被触发(通过全部任务或者在rake命令行中select其中的一个)。