2010-06-12 3 views
6

내 프로젝트 최상위 레벨의 Rakefile이 나무에서 더 깊은 rakefiles를 사용하여 물건을 만들길 원합니다; 즉, 최상위 레벨의 레이크 파일은 프로젝트 (큰 그림)를 빌드하는 방법과 낮은 레벨의 레이크 파일이 특정 모듈 (로컬 그림)을 빌드하는 방법을 말합니다.재귀 레이크 방법? - 또는 적합한 대안들

작업간에 공유 할 수있을 때마다 작업을 수행하는 데 대한 세부적인 세부 사항을 공유하는 구성 세트가 있습니다. 따라서 빌드 할 소스에 대한 설명을 유지하는 것이 대부분입니다. 예 : /Source/Module/code.foo와 cie는/Source/Module/Rakefile의 지침을 사용하여 빌드해야합니다. 및/Rakefile은 모듈 간의 종속성을 이해합니다.

여러 개의 레이크 프로세스 (ala recursive make)를 사용하거나 별도의 빌드 환경을 만드는 경우 상관하지 않습니다. 어느 쪽이든 그것은 큐에 의해 처리되기에 충분할만큼 독립적이어야한다. 그래서 비 종속 모듈이 동시에 빌드 될 수있다.

문제는 실제로 레이크에서 어떻게 할 것인가입니다. 인터넷이나 문서에서 의미있는 것을 찾지 못했습니다. 나는 새로운 Rake :: Application 객체를 생성하고 그것을 설정하려고 시도했지만 무엇이든간에 methods 예외 만 호출하거나 "태스크를 빌드하는 방법을 모른다": 기본 '오류가 발생합니다. (예, 모든 rakefiles에는 : default가 있습니다). 물론 modulename 작업을 위해 하위 디렉토리에서 'rake'를 실행할 수는 있지만 최상위 레벨에 주어진 옵션을 버릴 수 있습니다. 예 : $ (MAKE)와 $ (MAKEFLAGS)를 생각해보십시오.

누구나 recursive 레이크를 제대로 수행하는 방법에 대한 단서가 있습니까?

답변

2

다른 레이크 파일의 require 레이크 파일을 실행하고 필요한 파일에서 작업을 실행할 수 있습니다.

는 rakefile.rb에 넣고 :
task :bar do 
    puts "baz" 
end 

루트 레벨 rakefile을 실행하고 화면에 "바즈"를 출력 할 것이다 :
require 'foo/rakefile.rb' 

task :default => [:bar] 

푸/rakefile.rb에 넣고. 당신은 레이크 파일과 일반적인 코드를 정리할 수 있어야합니다. 그러나이 아이디어를 사용하길 원할 것입니다.

0

다른 RakeFile에서 다른 레이크 작업 내에서 레이크 작업을 호출해야한다는 것이 당신의 문제라는 것을 잘 압니다.

필요할 경우/Source/Module/Rakefile에서 필요한 작업을 빌드하고/Rakefile에서 다른 Rakefile을 만들고 그런 식으로 작업을 실행할 수 있습니다.

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

-f하면 Rakefile이 당신의 rakelib 폴더 -R과 위치를 지정할 수도 수

을 위치를 사용자가 정의 할 수 있습니다.

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

이 정보가 도움이되기를 바랍니다.

+0

레이크 -f의 단점은이 호출 된 rakefile의 위치로 작업 디렉토리를 설정하지 않는다는 것입니다. –

0

나는 비슷한 요구 사항을 가지고 다음과 같은 함수를 만들었습니다.

rakeutils.RB :

옵션에 대한
require 'rakeutils' 

task :test1 do 
    puts "Hi" 
end 

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

, 내가 찾을 didnt가 어떤 :

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

그리고 난이 기능을 가지고 원하는 목적지 Rakefiles에서

가, 난 그냥 예를 위해 ...

Rakefile 그것을 포함 레이크의 옵션 처리로 소비되기 전에 "레이크"를 편집하고 옵션을 캡처하는 것 이외의 다른 방법을 자동으로 전달하는 방법

+0

BTW, 위의 코드에는 "-n 또는 --dry-run"이 제공 될 때 반복적으로 드라이 런을 실행할 수 없다는 또 다른 제한이 있습니다. 재귀 적 레이크에 옵션을 전달하여 재귀 적으로 드라이 런을 원한다면, 제 다른 대답 – siva008

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