2010-06-12 61 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