2011-03-16 16 views
9

Tengo el siguiente ejemplo que se basa en la estructura quiero mi Rakefile de empleo:¿Las dependencias de tareas siempre se ejecutan en un orden específico con rake?

task :default do 
    puts 'Tasks you can run: dev, stage, prod' 
end 

task :dev => [:init,:devrun,:clean] 
task :devrun do 
    puts 'Dev stuff' 
end 

task :stage => [:init,:stagerun,:clean] 
task :stagerun do 
    puts 'Staging stuff' 
end 

task :prod => [:init,:prodrun,:clean] 
task :prodrun do 
    puts 'Production stuff' 
end 

task :init do 
    puts 'Init...' 
end 

task :clean do 
    puts 'Cleanup' 
end 

¿Las tareas siempre se puede ejecutar en el mismo orden? Leí en algún lado que no lo harían, y en otro lugar lo harían, así que no estoy seguro.

O si puede sugerir una forma mejor de hacer lo que estoy tratando de lograr (por ejemplo, tener un paso de limpieza e inicio común que rodee un paso dependiente del entorno), eso también sería bueno.

Gracias

Respuesta

15

A partir del código fuente Rake:

# Invoke all the prerequisites of a task. 
def invoke_prerequisites(task_args, invocation_chain) # :nodoc: 
    @prerequisites.each { |n| 
    prereq = application[n, @scope] 
    prereq_args = task_args.new_scope(prereq.arg_names) 
    prereq.invoke_with_call_chain(prereq_args, invocation_chain) 
    } 
end 

lo que parece que el código normalmente simplemente itera la matriz y se ejecutan las tareas previas de forma secuencial.

Sin embargo:

# Declare a task that performs its prerequisites in parallel. Multitasks does 
# *not* guarantee that its prerequisites will execute in any given order 
# (which is obvious when you think about it) 
# 
# Example: 
# multitask :deploy => [:deploy_gem, :deploy_rdoc] 
# 
def multitask(args, &block) 
    Rake::MultiTask.define_task(args, &block) 
end 

Así que tienen razón, ambos pueden ser verdad, pero el orden sólo puede ser apagado si el prefijo de su tarea con multitask Parece que las tareas regulares se ejecutan en orden.

Cuestiones relacionadas