rake - 如何从Rake任务运行Rake的任务呢?

  显示原文与译文双语对照的内容

我有一个通过两种方式编译项目的平台,根据全局变量 $build_type,可以是 :debug 或者 :release ( 结果在单独的目录中):


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

是否可以将任务调用为方法? 或者如何实现类似的?

时间:

如果你需要任务作为一种方法,那么如何使用一个实际方法?


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
    
    

    ( 注意已经调用的依赖项不是 re-executed )


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| 
 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

我建议不要创建一般的调试和发布任务,如果项目真的是可以编译的,那么就会产生文件。 你应该使用 file-tasks,这在你的示例中非常可行,因为你的状态是,你的输出进入不同的目录。 假设你的项目只是将一个 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. 根据需要创建输出目录。
  2. 只有在需要( 这里示例仅对最简单的test.c 文件正确) 时才重新编译这些文件。
  3. 如果你想触发发布版本或者调试构建,就可以随时轻松地完成所有任务。
  4. 这里示例还提供了一个在调试和release-builds之间定义小差异的方法。
  5. 不需要重新启用带有全局变量的build-task,因为现在不同的版本有不同的任务。 codereuse build-task是通过定义build-tasks重用代码。 查看循环如何不执行两次相同的任务,而是创建任务,稍后可以触发( 要么是 all-task,要么是在rake命令行中选择其中之一) 。
...