2010-02-26 17 views
14

Digamos que tengo un objetivo que necesita compilar algunos archivos. Ese objetivo tiene otro objetivo como requisito previo, uno que obtiene los archivos. Digamos esto:¿Cómo se comunica entre las tareas de Rake?

task :obtain do 
    # obtain files from somewhere 
end 

task :compile => :obtain do 
    # do compilation 
end 

Digamos que el objetivo :obtain no siempre coloca los archivos en la misma carpeta. ¿Cómo pasaría :compile la ruta que se encontró :obtain? ¿Variables de entorno?

Respuesta

13

Usando ENV [ 'algo'] es en mi opinión es preferible, ya que si lo haces de esta manera (a diferencia de las variables $ global o @instance) puede tratarlos como argumentos de tareas, y usar la subtarea desde la línea de comandos fácilmente.

Por otro lado, si mantiene su código en clases/módulos/métodos separados, ni siquiera tendrá que lidiar con ese tipo de piratería + su código será más comprobable.

+0

Sí. Así es como terminé haciéndolo. ¡Gracias! – Geo

+0

Debe tenerse en cuenta que ENV solo puede tomar cadenas como claves y valores, por lo que aunque esta restricción puede no importar en el caso de los nombres de archivos, puede que no sea una buena solución cuando se trata de otros tipos de valores. – Dologan

10

Una forma sería para almacenarlo en una variable global:

task :obtain do 
    $obtained_dir = "/tmp/obtained" 
end 

task :compile => :obtain do 
    puts "compiling files in #{$obtained_dir}" 
end 

Las variables de instancia (es decir @obtained_dir) también deben trabajar.

Otra forma sería la de tirar el código "obtener" en un método, de la siguiente manera:

task :obtain do 
    obtain_files 
end 

task :compile do 
    obtained_dir = obtain_files 
    puts "compiling files in #{obtained_dir}" 
end 

def obtain_files 
    #obtain files from somewhere 
    "/tmp/obtained_files" 
end 
+1

+1 para la manera de ponerlo en forma de hacerlo. tarea: obtener no parece una tarea en absoluto, es solo un método que otras personas llaman. –

Cuestiones relacionadas