如何从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) 

这要求多一点,但显示了我的观点:

  1. 输出目录是根据需要创build的。
  2. 如果需要的话,这些文件只会被重新编译(这个例子只适用于最简单的test.c文件)。
  3. 如果要触发发布版本或debugging版本,您可以随时掌握所有任务。
  4. 这个例子包含了一个方法来定义debugging和发布版本之间的细微差别。
  5. 不需要重新启用一个用全局variables参数化的构build任务,因为现在不同的构build有不同的任务。 构build任务的codereuse是通过重用代码来定义构build任务完成的。 看看循环如何不执行两次相同的任务,而是创build任务,这些任务可以稍后被触发(通过全部任务或者在rake命令行中select其中的一个)。