如何多次执行带参数的Rake任务?

And*_*ngh 14 ruby rake

不可能invoke在循环内多次执行相同的rake任务.但是,我希望能够调用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
Run Code Online (Sandbox Code Playgroud)

围绕它的一个方法就是将参数execute放入一个数组中并second检查args的结构,但这看起来好像是hackish.还有另一种(更好的?)方式来完成我想做的事情吗?

小智 21

您可以使用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
Run Code Online (Sandbox Code Playgroud)

$ rake first

1
bar
2
bar
3
bar
4
bar
Run Code Online (Sandbox Code Playgroud)