2010-06-12 7 views
6

Voglio i miei progetti Rakefile di alto livello per costruire cose usando rakefiles più in profondità nell'albero; Il rakefile di alto livello dice come costruire il progetto (immagine grande) e quelli di livello inferiore costruiscono un modulo specifico (immagine locale).Come rastrellare ricorsivo? - o alternative adatte

Esiste naturalmente un insieme condiviso di configurazione per i dettagli minuziosi di farlo ogni volta che può essere condiviso tra le attività: in questo modo si tratta principalmente di mantenere le descrizioni di ciò che è necessario costruire, il più vicino possibile alle origini. Per esempio. /Source/Module/code.foo e cie dovrebbero essere creati usando le istruzioni in/Source/Module/Rakefile; e/Rakefile comprende le dipendenze tra i moduli.

Non mi interessa se utilizza più processi di rake (ala ricorsive make), o crea solo ambienti di compilazione separati. In ogni caso, dovrebbe essere autosufficiente abbastanza da essere elaborato da una coda: in modo che i moduli non dipendenti possano essere costruiti contemporaneamente.

Il problema è, che diamine fai davvero qualcosa del genere con Rake !? Non sono stato in grado di trovare nulla di significativo su Internet, né nella documentazione. Ho provato a creare un nuovo oggetto Rake :: Application e a configurarlo, ma qualunque cosa sia methods provo a invocare, solo eccezioni o "Non so come creare attività": vengono emessi errori "predefiniti". (Sì, tutti i rakefiles hanno un: default). Ovviamente si potrebbe semplicemente eseguire 'rake' in una sottodirectory per un task: modulename, ma ciò significherebbe abbandonare le opzioni date al livello più alto; per esempio. pensa a $ (MAKE) e $ (MAKEFLAGS).

Chiunque ha idea di come eseguire correttamente qualcosa come un rastrello recursive?

risposta

2

è possibile require raccogliere file da altri file rake ed eseguire le attività dal file richiesto.

mettere questo in rakefile.rb:

require 'foo/rakefile.rb' 

task :default => [:bar] 

mettere questo in foo/rakefile.rb:

task :bar do 
    puts "baz" 
end 

eseguire il rakefile livello principale e stamperà "baz" sullo schermo. dovresti essere in grado di organizzare i tuoi file rake e codice comune, ma vuoi usare questa idea

0

Se ho capito bene il tuo problema è che devi chiamare un'attività Rake in un'altra attività Rake da un RakeFile diverso.

È possibile creare le attività necessarie in/Source/Module/Rakefile nel modo in cui è necessario e creare un altro Rakefile in/Rakefile ed eseguire le attività in questo modo.

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

-f lasciare che si definisce dove il Rakefile si trova

Si può anche specificare dove la cartella rakelib si trova con -R.

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

Spero che questo ti possa aiutare.

+0

L'aspetto negativo di rake -f è che non imposta la directory di lavoro alla posizione del rakefile invocato. –

0

Ho anche il requisito analogo e ha creato la seguente funzione

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 

e in Rakefiles, ovunque io voglio avere questa caratteristica, ho appena includerlo ... per esempio

Rakefile:

require 'rakeutils' 

task :test1 do 
    puts "Hi" 
end 

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

quanto riguarda le opzioni, non ho trovato alcuna modo automatico di passarli ... oltre a modificare "rake" e catturare le opzioni prima che vengano consumate dall'elaborazione delle opzioni del rake

+0

BTW, il codice sopra riportato ha un'altra limitazione che non può essere eseguito ricorsivamente quando viene fornito "-n o --dry-run". Se si desidera eseguire ricorsivamente una corsa a secco con le opzioni di passaggio al rake ricorsivo, vedere l'altra risposta – siva008

2

Come menzionato nel mio post precedente, ecco il codice sn ippet che supporta quasi come il comportamento del rastrello ricorsivo tra cui il passaggio delle opzioni, la gestione a secco, la traccia, l'attività di livello superiore.

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 
+0

, per favore, questo script è stato testato solo con ruby2.0 e rake 0.9.6. Qualunque modifica nelle parti interne del "rake" potrebbe infrangere il codice precedente – siva008