2012-09-11 11 views
14

Nie można wykonać tego samego zadania rake z pętli more than once. Ale chcę mieć możliwość wywoływania rake first i przechodzenia przez macierz i wywoływania second w każdej iteracji z różnymi argumentami. Ponieważ invoke jest wykonywany tylko za pierwszym razem, próbowałem użyć execute, ale Rake::Task#execute nie używa operatora splat (*) i przyjmuje tylko jeden argument.Jak wielokrotnie wykonywać zadania Rake z argumentami?

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 

Jeden Hack wokół niego jest umieszczenie argumenty execute do tablicy iw second zbadać strukturę args, ale wydaje się, że dobrze, hackish. Czy istnieje inny (lepszy?) Sposób na wykonanie tego, co chciałbym zrobić?

Odpowiedz

19

Możesz użyć opcji Rake :: Task # reenable, aby umożliwić jej ponowne wywołanie.

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 

$ prowizji pierwszy

1 
bar 
2 
bar 
3 
bar 
4 
bar 
+0

To wygląda ślisko. Dzięki! –

4

Funkcja execute prosi o Rake::TaskArguments jako parametr, to dlatego, że przyjmuje tylko jeden argument.

You could use

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

Jednak jest jeszcze jedna różnica między powołaniem i wykonywać, wykonać nie uruchomić: prerequisite_task invoke, gdy robi to pierwszy, więc powoływać i ponownie włączyć lub wykonać nie mają dokładnie takie samo znaczenie .

Powiązane problemy