2012-09-11 17 views
14

No es posible invoke la misma tarea de rake desde un bucle more than once. Pero, quiero poder llamar al rake first y recorrer una matriz e invocar second en cada iteración con diferentes argumentos. Dado que invoke solo se ejecuta la primera vez, traté de usar execute, pero Rake::Task#execute no usa el operador splat (*) y solo toma un solo argumento.¿Cómo ejecuto las tareas de Rake con argumentos varias veces?

desc "first task" 
task :first do 
    other_arg = "bar" 
    [1,2,3,4].each_with_index do |n,i| 
    if i == 0 
     Rake::Task["foo:second"].invoke(n,other_arg) 
    else 
     # this doesn't work 
     Rake::Task["foo:second"].execute(n,other_arg) 
    end 
    end 
end 

task :second, [:first_arg, :second_arg] => :prerequisite_task do |t,args| 
    puts args[:first_arg] 
    puts args[:second_arg] 
    # ... 
end 

Un truco alrededor de ella es poner los argumentos a execute en una matriz y en second examinar la estructura de los argumentos, pero que parece, así, hacker. ¿Hay alguna otra (¿mejor?) Forma de lograr lo que me gustaría hacer?

Respuesta

19

Puede usar Rake :: Task # reenable para permitir su invocación nuevamente.

desc "first task" 
task :first do 
    other_arg = "bar" 
    [1,2,3,4].each_with_index do |n,i| 
    if i == 0 
     Rake::Task["second"].invoke(n,other_arg) 
    else 
     # this does work 
     Rake::Task["second"].reenable 
     Rake::Task["second"].invoke(n,other_arg) 
    end 
    end 
end 

task :second, [:first_arg, :second_arg] do |t,args| 
    puts args[:first_arg] 
    puts args[:second_arg] 
    # ... 
end 

$ rastrillo primera

1 
bar 
2 
bar 
3 
bar 
4 
bar 
+0

Eso se ve resbaladizo. ¡Gracias! –

4

La función execute pide un Rake::TaskArguments como parámetro, es por ello que sólo acepta un argumento.

You could use

stuff_args = {:match => "HELLO", :freq => '100' } 
Rake::Task["stuff:sample"].execute(Rake::TaskArguments.new(stuff_args.keys, stuff_args.values)) 

Sin embargo, existe otra diferencia entre invocar y ejecutar, ejecutar no se ejecuta el: prerequisite_task cuando se hace invocación de este principio, así invocar y vuelva a habilitar o ejecutar no tiene exactamente el mismo significado .

Cuestiones relacionadas