2012-09-11 5 views
14

ループ内から同じレーキタスクinvokeを実行することはできませんmore than onceしかし、私はrake firstを呼び出すことができ、配列をループして、それぞれの反復で異なる引数でsecondを呼び出したいと考えています。 invokeはじめて実行されるため、executeを使用しようとしましたが、Rake::Task#executeはsplat(*)演算子を使用せず、引数は1つのみです。その周り複数の引数を指定してRakeタスクを実行するにはどうすればよいですか?

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 

一つのハックは、配列にexecuteに引数を入れて、secondで引数の構造を調べることであるが、それはハック、まあ、そうです。私は何をしたいのですか?

答えて

19

Rake :: Task#reenableを使用して、再度呼び出すことができます。それが唯一の引数を受け取り、なぜ$

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 

熊手は

1 
bar 
2 
bar 
3 
bar 
4 
bar 
+0

それは滑らかに見えます。ありがとう! –

4

execute関数は、パラメータとしてRake::TaskArgumentsを尋ねる最初、これはあります。呼び出しは、最初にこれを行いprerequisite_task、その呼び出し、再び有効化するか、まったく同じ意味を持っていない実行します。

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

You could useは、しかし実行されません実行し、呼び出しと実行の間に別の違いがあります。

関連する問題