2010-06-12 7 views
6

Quiero que mis proyectos de nivel superior Rakefile construyan cosas usando rakefiles más profundos en el árbol; es decir, el archivo de seguimiento de nivel superior dice cómo construir el proyecto (panorama general) y los de nivel inferior crean un módulo específico (imagen local).¿Cómo el rastrillo recursivo? - o alternativas adecuadas

Por supuesto, hay un conjunto compartido de configuraciones para los detalles minuciosos de hacerlo cada vez que puede compartirse entre tareas: por lo tanto, se trata principalmente de mantener las descripciones de lo que se necesita construir, tan cerca de las fuentes que se construyen. P.ej. /Source/Module/code.foo y cie deben construirse usando las instrucciones en/Source/Module/Rakefile; y/Rakefile comprende las dependencias entre módulos.

No me importa si utiliza múltiples procesos de rake (ala recursive make), o simplemente crea entornos de compilación separados. De cualquier manera, debe ser autocontenible para ser procesado por una cola: para que los módulos no dependientes puedan construirse simultáneamente.

El problema es, ¿cómo diablos haces realmente algo así con Rake? No he podido encontrar nada significativo en Internet, ni en la documentación. Intenté crear un nuevo objeto Rake :: Application y configurarlo, pero cualquiera que sea el methods que intente invocar, solo se lanzarán excepciones o errores "No sé cómo compilar tareas ': default'". (Sí, todos los rakefiles tienen un: predeterminado). Obviamente, uno podría simplemente ejecutar 'rake' en un subdirectorio para una tarea: modulename, pero eso eliminaría las opciones dadas al nivel superior; p.ej. pensar en $ (MAKE) y $ (MAKEFLAGS).

¿Alguien tiene una pista sobre cómo hacer algo como un rastrillo recursive?

Respuesta

2

puede require rastrear archivos de otros archivos rake y ejecutar las tareas desde el archivo requerido.

poner esto en rakefile.rb:

require 'foo/rakefile.rb' 

task :default => [:bar] 

poner esto en foo/rakefile.rb:

task :bar do 
    puts "baz" 
end 

corren el Rakefile nivel de la raíz y se imprimirá "Baz" a la pantalla. debería poder organizar sus archivos de rake y código común como lo desee usando esta idea

0

Si entendí bien su problema es que necesita llamar a una tarea de Rake dentro de otra tarea Rake desde un RakeFile diferente.

Puede crear sus tareas necesarias en/Source/Module/Rakefile de la manera que lo necesita y crear otro Rakefile en/Rakefile y ejecutar tareas de esa manera.

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

-f permiten definir donde el Rakefile se encuentra

También puede especificar el lugar en su carpeta rakelib se encuentra con -R.

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

Espero que esto te ayude.

+0

La desventaja de -f rastrillo es que no establece el directorio de trabajo a la ubicación de la Rakefile invocado. –

0

que también tienen el requisito similar y crea la siguiente función

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 

y en Rakefiles, donde quiero tener esta función, sólo se incluyen ... por ejemplo

Rakefile:

require 'rakeutils' 

task :test1 do 
    puts "Hi" 
end 

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

respecto a las opciones, no encontré ningún forma automática de pasarlos ... además de editar "rake" y capturar las opciones antes de ser consumido por el proceso de opción del rake

+0

BTW, el código anterior tiene otra limitación que no se puede ejecutar de forma recursiva cuando se proporciona "-n o" run-run ". Si realmente quiere un funcionamiento en seco recursivo con opciones de pase al rake recursivo, entonces vea mi otra respuesta – siva008

2

Como mencioné en mi publicación anterior, aquí está el código sn ippet que admite casi el mismo comportamiento de rake recursivo, incluidas las opciones de pasar, ejecución en seco, rastreo, tarea de nivel superior.

rastrillo:

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

tenga en cuenta que este script solo se prueba con ruby2.0 y con el rastrillo 0.9.6. Cualquier cambio en el interior del "rake" puede romper el código anterior – siva008

Cuestiones relacionadas