2012-09-11 1 views
14

Es ist nicht möglich, invoke die gleiche Rake-Task innerhalb einer Schleife more than once. Aber ich möchte in der Lage sein, rake first aufrufen und durch ein Array durchlaufen und second bei jeder Iteration mit verschiedenen Argumenten aufrufen. Da invoke nur beim ersten Mal ausgeführt wird, habe ich versucht, execute zu verwenden, aber Rake::Task#execute verwendet nicht den Splat (*) -Operator und nimmt nur ein einziges Argument.Wie führe ich Rake-Aufgaben mit Argumenten mehrmals aus?

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 

Ein Hack um es ist, die Argumente zu execute in ein Array zu setzen und in second die Struktur von args zu untersuchen, aber das scheint, gut, hackish. Gibt es einen anderen (besseren?) Weg, um das zu erreichen, was ich gerne tun würde?

Antwort

19

Sie können Rake :: Task # reenable verwenden, damit es erneut aufgerufen werden kann.

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 

Rake $ ersten

1 
bar 
2 
bar 
3 
bar 
4 
bar 
+0

Das sieht glatt aus. Vielen Dank! –

4

Die execute Funktion fragt nach einem Rake::TaskArguments als Parameter, deshalb nur es ein Argument akzeptiert.

You could use

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

Allerdings gibt es einen weiteren Unterschied zwischen invoke und auszuführen, führen nicht läuft das: prerequisite_task wenn invoke diese erste Fall ist, so aufrufen und reaktivieren oder ausführen nicht genau die gleiche Bedeutung .