如何多次执行带参数的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 

围绕它的一个方法就是将execute的参数放入一个数组中,然后再检查args的结构,但这似乎是hackish。 是否还有另一种(更好的?)方式来完成我想做的事情?

您可以使用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 

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之间还有另一个区别,当invoke首先执行此操作时,execute不运行:prerequisite_task,因此invoke和reenable或execute不具有完全相同的含义。

这对我有用,很容易理解你只需要循环你的bash命令。

 task :taskname, [:loop] do |t, args| $i = 0 $num = args.loop.to_i while $i < $num do sh 'your bash command'' $i +=1 end end