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

问题描述 投票:14回答:3

invoke循环中,more than once不可能执行相同的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的参数放入一个数组中,并在second中检查args的结构,但这看起来好像是hackish。还有另一种(更好的?)方式来完成我想做的事情吗?

ruby rake
3个回答
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

4
投票

execute函数要求将Rake::TaskArguments作为参数,这就是为什么它只接受一个参数。

You could use

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不具有完全相同的含义。


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
© www.soinside.com 2019 - 2024. All rights reserved.