15

invokeループ内から同じタスクを2 回以上レーキすることはできません。rake firstしかし、配列を呼び出してループし、second反復ごとに異なる引数で呼び出すことができるようにしたいと考えています。invoke初回のみ実行されるので、 を使ってみたexecuteのですが、Rake::Task#executeは splat (*) 演算子を使わず、引数を 1 つしか取りません。

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

1 つのハックは、引数をexecute配列に入れ、引数secondの構造を調べることですが、それはハックのようです。私がやりたいことを達成するための別の(より良い?)方法はありますか?

4

4 に答える 4

24

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
于 2012-10-18T06:33:12.910 に答える
4

execute関数はパラメータとしてRake::TaskArgumentsを要求します。これが引数を 1 つしか受け付けない理由です。

あなたが使用することができます

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

ただし、invoke と execute には別の違いがあります。execute は、invoke が最初に :prerequisite_task を実行するときに実行しないため、invoke と reenable または execute はまったく同じ意味を持ちません。

于 2013-10-31T13:55:00.110 に答える