Как выполнять задания Rake с аргументами несколько раз?

Невозможно invoke выполнить одну и ту же задачу рейка из цикла более одного раза. Но я хочу, чтобы иметь возможность вызывать rake first и цитировать через массив и вызывать second на каждой итерации с разными аргументами. Поскольку invoke запускается только в первый раз, я пытался использовать execute, но Rake:: Task # execute не используйте оператор splat (*) и принимайте только один аргумент.

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 проверить структуру args, но это кажется, ну, хаки. Есть ли другой (лучший?) Способ выполнить то, что я хотел бы сделать?

Ответы

Ответ 1

Вы можете использовать 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

$rake first

1
bar
2
bar
3
bar
4
bar

Ответ 2

Функция execute запрашивает Rake:: TaskArguments как параметр, поэтому он принимает только один аргумент.

Вы можете использовать

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

Однако существует еще одна разница между invoke и execute, execute не запускает: prerequisite_task, когда invoke выполняет это сначала, поэтому вызов и повторное использование или выполнение не имеют точно такого же значения.