2012-09-11 14 views
14

invoke bir döngü içinde aynı sorgu görevi için more than once mümkün değil. Ancak, rake first'u arayabilmek ve bir dizi boyunca döngü oluşturmak ve farklı yinelemelerle her yinelemede second'u çağırmak istiyorum. invoke sadece ilk kez çalıştırıldığı için, execute'u kullanmayı denedim, ancak Rake::Task#execute splat (*) operatörünü kullanmıyor ve sadece tek bir argüman alıyor. EtrafındaBirden çok kez bağımsız değişkenlerle Rake görevlerini nasıl yürütürüm?

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 

Bir kesmek bir diziye execute argümanlar koymak ve second içinde args yapısını incelemek, ama bu hackish, iyi görünüyor. Ne yapmak istediğimi gerçekleştirmek için başka bir (daha iyi?) Yolu var mı?

cevap

19

Yeniden başlatılmasına izin vermek için Rake :: Task # reenable'ı kullanabilirsiniz. sadece bir argüman kabul niçin $

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

1 
bar 
2 
bar 
3 
bar 
4 
bar 
+0

Bu kaygan görünüyor. Teşekkürler! –

4

execute fonksiyonu parametre olarak bir Rake::TaskArguments sorar ilk, bu. çağırmak bu ilk yapan prerequisite_task, bu yüzden çağırmak ve yeniden etkinleştirmek veya tam olarak aynı anlama sahip değildir yürütün:

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

You could use Ancak çalışmaz yürütmek, çağırmak ve yürütmek arasındaki başka bir fark yoktur .

İlgili konular