2010-06-12 62 views
6

我希望我的项目顶级Rakefile能够使用更深的树中的rakefiles构建东西;即顶级rakefile说明如何构建项目(大图),而低级别构建特定的模块(本地图片)。如何递归耙子? - 或者合适的替代方案

当然,每当它可以在任务之间共享时,这样做的细节当然有一组共享的配置:所以它主要是关于保持需要构建的描述,尽可能接近构建的源。例如。 /Source/Module/code.foo和cie应该使用/ Source/Module/Rakefile中的指令来构建;和/ Rakefile理解模块之间的依赖关系。

我不在乎它是否使用多个rake进程(ala递归make),或者只是创建单独的构建环境。无论哪种方式,它都应该是足够自我容纳的,以便能够被队列处理:因此可以同时构建非依赖模块。

问题是,你真的用Rake做类似的事情吗?我一直无法在互联网上找到任何有意义的东西,在文档中也找不到。我尝试创建一个新的Rake :: Application对象并设置它,但无论我尝试调用,只抛出异常或“不知道如何构建任务”:default'“错误。 (是的,所有rakefiles都有:default)。很明显,人们可以在子目录中执行'rake'来完成:modulename任务,但是会抛弃给顶层的选项;例如想想$(MAKE)和$(MAKEFLAGS)。

任何人都有一个线索,如何正确做一些事情,如recursive耙?

回答

2

您可以require从其他rake文件中获取文件并从所需文件运行任务。

把这个rakefile.rb:

require 'foo/rakefile.rb' 

task :default => [:bar] 

把这个在富/ rakefile.rb:

task :bar do 
    puts "baz" 
end 

运行根级别Rake文件,它会打印出 “巴兹” 到屏幕上。你应该可以,但是你想使用这个想法

0

组织你的耙文件和通用代码。如果我深知你的问题是,你需要从不同的Rake文件调用另一个Rake任务中的Rake任务。

你可以建立你需要的任务/资源/模块/ Rake文件,你需要它,使另一Rake文件在/ Rake文件和运行任务,这样的方式。

desc 'Description' 
task :foo do 
    %x[rake -f /Source/Module/RakeFile foo:bar] 
end 

-f让你定义在Rake文件位于

你也可以指定你的rakelib文件夹所在与-R。

rake -f /path/to/Rakefile -R /path/to/rakelib foo:bar 

我希望这会帮助你。

+0

耙-f的缺点是,它不设置工作目录到被调用的Rake文件的位置。 – 2015-05-01 23:00:08

0

我也有类似的要求,建立了以下功能

rakeutils。RB:

def subdirs dirs 
    dirs.each do |d| 
     task d do |t| 
     sh("cd #{t.name} && pwd && rake") 
     end 
    end 
    task :default => dirs 
end 

和Rakefiles,无论我希望有这个功能,我只是包括它...用于如

Rake文件:

require 'rakeutils' 

task :test1 do 
    puts "Hi" 
end 

task :default => :test1 
subdirs ["ab", "cd"] 

有关的选项,我没有发现任何自动的方式传递他们...除了编辑“耙”和捕捉选项之前,它是由耙的选项处理消耗

+0

顺便提一下,上面的代码有另外一个局限性,当它提供“-n或--dry-run”时,它不能递归干运行。如果你真的想用递归耙递归选项递归干运行,那么请看我的其他回答 – siva008 2013-11-23 17:39:00

2

正如我在前面的帖子中提到的,这里是代码sn支持与递归耙子行为几乎相同的ippet,包括选项传递,空运行,追踪,顶级任务。

耙:

#!/usr/bin/env ruby 

begin 
    require 'rubygems' 
    gem 'rake' 
rescue LoadError 
end 

$sub_directories = [] 
$top_level_task_provided__skip_subdir = 0 
module Rake 
    REDUCE_COMPAT = true if ARGV.include?("--reduce-compat") 
    RAKE_OPTS = ARGV.clone.join(" ") 
    module DSL 
    def subdirs dirs 
     puts "DIRS: #{dirs}" 
     $sub_directories = dirs 
    end 
    end 
end 

require 'rake' 

Rake.application.standard_exception_handling do 
    Rake.application.init 
    $top_level_task_provided__skip_subdir = 1 if Rake.application.top_level_tasks.size >= 1 and Rake.application.top_level_tasks[0] != "default" 
    Rake.application.load_rakefile 
    if Rake.application.tasks.size == 0 and $sub_directories.size != 0 then 
     desc "Default task when only subdirs is present in a rakefile" 
     task :default do 
     puts "Default subdir task" 
     end 
    end 
    Rake.application.top_level 
end 

if $top_level_task_provided__skip_subdir == 0 then 
    $sub_directories.each do |d| 
     unless rake_system("cd #{d} && pwd && ruby #{File.expand_path $0} #{Rake::RAKE_OPTS}") then 
      exit(1) 
     end 
    end 
end 
+0

请注意,这个脚本只用ruby2.0和rake 0.9.6测试过。 “rake”内部的任何更改都可能会破坏上面的代码 – siva008 2013-11-23 17:50:33