15

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放入一个数组并second检查 args 的结构,但这看起来,嗯,hackish。还有另一种(更好的?)方法来完成我想做的事情吗?

4

4 回答 4

24

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

$先抽成

1
bar
2
bar
3
bar
4
bar
于 2012-10-18T06:33:12.910 回答
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 之间还有另一个区别,execute 不会在 invoke 首先执行此操作时运行 :prerequisite_task,因此 invoke 和 reenable 或 execute 的含义并不完全相同。

于 2013-10-31T13:55:00.110 回答
1

FWIW这可能会帮助某人,所以我会发布它。

我希望能够从 CLI 运行一个命令来多次运行一个 Rake 任务(每次都使用新参数,但这并不重要)。

例子:

rake my_task[x] my_task[y] my_task[z]

然而,由于 Rake 将所有my_task的 args 都视为同一个任务,因此它只会在第一次调用而my_task[x]不会调用my_task[y]and my_task[z]

使用Rake::Task#reenable其他答案中提到的方法,我编写了一个reenableRake 任务,您可以将其定位在任务之后运行以允许它再次运行。

结果:

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
于 2020-06-16T17:12:47.727 回答
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
于 2018-09-03T10:08:44.317 回答