2012-09-11 4 views
14

Non è possibile invoke la stessa attività rake da un loop more than once. Ma, voglio essere in grado di chiamare rake first e fare un ciclo attraverso una matrice e invocare second in ogni iterazione con argomenti diversi. Dal momento che invoke viene eseguito solo la prima volta, ho provato a utilizzare execute, ma Rake::Task#execute non utilizza l'operatore splat (*) e accetta solo un singolo argomento.Come si eseguono le attività di Rake con gli argomenti più volte?

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 

Una trucco intorno è mettere gli argomenti execute in una matrice e in second esaminare la struttura di args, ma che sembra, bene, hackish. C'è un altro (migliore?) Modo di realizzare ciò che mi piacerebbe fare?

risposta

19

È possibile utilizzare Rake :: Task # riattivabile per consentire di richiamarlo di nuovo.

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 

$ rastrello primo

1 
bar 
2 
bar 
3 
bar 
4 
bar 
+0

Questo sembra perfetto. Grazie! –

4

La funzione execute chiede un Rake::TaskArguments come parametro, questo è il motivo per cui accetta un solo argomento.

You could use

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

Tuttavia v'è un'altra differenza tra invocare ed eseguire, eseguire non eseguire il: prerequisite_task quando invocano fa questo primo, così invocare e riattivare o eseguire non ha esattamente lo stesso significato .