无法在循环more than once内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的结构,但这看起来好像是hackish。还有另一种(更好的?)方式来完成我想做的事情吗?
答案 0 :(得分: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
$ rake first
1
bar
2
bar
3
bar
4
bar
答案 1 :(得分:4)
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的含义并不完全相同。
答案 2 :(得分:0)
这对我有用,很容易理解,您只需要循环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
答案 3 :(得分:0)
FWIW这可能会对某人有所帮助,所以我将其发布。
我希望能够从CLI运行一个命令以多次运行一个Rake任务(每次都使用新参数,但这并不重要)。
示例:
rake my_task[x] my_task[y] my_task[z]
但是,由于Rake将所有my_task
视为同一任务,而与参数无关,因此它将仅首次调用my_task[x]
,而不会调用my_task[y]
和my_task[z]
使用其他答案中提到的Rake::Task#reenable
方法,我编写了一个reenable
Rake任务,您可以将其放置在任务之后运行,以使其再次运行。
结果:
rake my_task[x] reenable[my_task] my_task[y] reenable[my_task] my_task[z]
我不会说这是理想的选择,但它适用于我的情况。
reenable
耙任务来源:task :reenable, [:taskname] do |_task, args|
Rake::Task[args[:taskname]].reenable
Rake::Task[:reenable].reenable
end