如何递归耙? - 或合适的替代品

时间:2010-06-12 00:32:21

标签: ruby build-process rake

我希望我的项目顶级Rakefile使用树中更深的rakefiles来构建东西;即顶级rakefile说明如何构建项目(大图),而较低级别的rakefile构建一个特定模块(本地图片)。

当然,只要可以在任务之间共享,就可以使用共享的一组配置来完成这些操作:因此,主要是关于保持对需要构建的描述,尽可能接近正在构建的源。例如。应使用/ Source / Module / Rakefile中的指令构建/Source/Module/code.foo和cie;和/ Rakefile理解模块之间的依赖关系。

我不关心它是否使用多个rake进程(ala recursive make),或者只是创建单独的构建环境。无论哪种方式,它都应该是可自包含的,以便由队列处理:这样可以同时构建非依赖模块。

问题是,你是如何用Rake实际做那样的事情的?我无法在互联网上找到任何有意义的东西,也没有在文档中找到。我尝试创建一个新的Rake :: Application对象并进行设置,但无论我尝试调用什么methods,只会抛出异常或“不知道如何构建任务':default'”错误。 (是的,所有rakefiles都有:default)。显然,人们可以在子目录中为:modulename任务执行'rake',但这会丢弃给予顶级的选项;例如想到$(MAKE)和$(MAKEFLAGS)。

任何人都知道如何正确地执行像recursive rake这样的事情吗?

4 个答案:

答案 0 :(得分:3)

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

把它放在rakefile.rb中:

require 'foo/rakefile.rb'

task :default => [:bar]

把它放在foo / rakefile.rb中:

task :bar do
  puts "baz"
end

运行根级别rakefile,它会将“baz”打印到屏幕上。你应该能够组织你的rake文件和公共代码,但是你想要使用这个想法

答案 1 :(得分:2)

正如我在之前的帖子中所提到的,这里的代码片段几乎支持递归rake行为,包括选项传递,干运行,跟踪,顶级任务。

耙:

#!/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

答案 2 :(得分:0)

如果我理解你的问题是你需要从另一个RakeFile中的另一个Rake任务中调用Rake任务。

您可以按照需要的方式在/ Source / Module / Rakefile中构建所需的任务,并在/ Rakefile中创建另一个Rakefile并以此方式运行任务。

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

-f 让您定义Rakefile的位置

您还可以使用-R。

指定rakelib文件夹的位置
rake -f /path/to/Rakefile -R /path/to/rakelib foo:bar

我希望这会对你有所帮助。

答案 3 :(得分: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"]

关于选项,我没有找到任何自动传递方式...除了编辑“rake”并在rake的选项处理消耗之前捕获选项