2009-11-06 14 views
5

Mam system kompilacji składający się z kilku podkatalogów z projektami, w których w każdej z nich jest oddzielna rastief (lub kilka plików rake). Żaden katalog najwyższego poziomu nie ma pliku rake, który przechodzi przez wszystkie podkatalogi i wywołuje rake przez: system ("rake"), otrzymuje pakiety wynikowe i wysyła je do odpowiedniego komputera. Czy istnieje bardziej elegancki sposób robienia tego? Próbowałem Rake.application.load(), ale to nie wydaje się przyjmować żadnego argumentu, który plik musi być załadowany (jak wspomniałem, czasami są 2 rakefiles w każdym podkatalogu),Multifile rake build

+0

Podobne https://stackoverflow.com/questions/28238838/rakefile-to-process-multiple-projects –

Odpowiedz

2

Ok, mam rozwiązanie, które opiera się na tym, co knoopx powiedział. Oto mój plik główny:

task :default do 
    FileList["*/**/rakefile*.rb"].each do |project| 
     # clear current tasks 
     Rake::Task.clear 
     #load tasks from this project 
     load project 
     if !Rake::Task.task_defined?(:default) 
      puts "No default task defined in #{project}, aborting!" 
      exit -1 
     else 
      dir = project.pathmap("%d") 
      Dir.chdir(dir) do 
       default_task = Rake::Task[:default] 
       default_task.invoke() 
      end 
     end 
    end 
    puts "Done building projects" 
end 

Każdy plik rake w podkatalogu musi zawierać definicję domyślnego zadania.

1

Po prostu stwórz nowy Rakefile u podstaw swojej dużego projektu i dynamicznie załadować podprojekcie Rakefiles

Dir.glob(File.join(File.dirname(__FILE__), '**', 'Rakefile')).each do |tasks| 
    load tasks 
end 
+0

To częściowo rozwiązuje problem. Mogę wywoływać zadania z innych plików, ale wygląda na to, że zależności nie są przetwarzane. Więc o główny plik z kodem, który wywołuje sub Rakefile z zadanie: default =>: foo zadanie: foo zrobić stawia "foo" koniec zadanie "foo" nie nazywa – paszczi