How do I execute Rake tasks with arguments multiple times?
Asked Answered
T

4

16

It's not possible to invoke the same rake task from within a loop more than once. But, I want to be able to call rake first and loop through an array and invoke second on each iteration with different arguments. Since invoke only gets executed the first time around, I tried to use execute, but Rake::Task#execute doesn't use the splat (*) operator and only takes a single argument.

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

One hack around it is to put the arguments to execute into an array and in second examine the structure of args, but that seems, well, hackish. Is there another (better?) way to accomplish what I'd like to do?

Transcurrent answered 11/9, 2012 at 22:52 Comment(0)
D
26

You can use Rake::Task#reenable to allow it to be invoked again.

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
Denver answered 18/10, 2012 at 6:33 Comment(0)
S
4

The execute function asks for a Rake::TaskArguments as a parameter, this is why it only accepts one argument.

You could use

stuff_args = {:match => "HELLO", :freq => '100' }
Rake::Task["stuff:sample"].execute(Rake::TaskArguments.new(stuff_args.keys, stuff_args.values))

However there is another difference between invoke and execute, execute doesn't run the :prerequisite_task when invoke does this first, so invoke and reenable or execute doesn't have exactly the same meaning.

Sherbrooke answered 31/10, 2013 at 13:55 Comment(0)
I
1

FWIW this might help someone so I'll post it.

I wanted to be able to run one command from the CLI to run one Rake task multiple times (each time with new arguments, but that's not important).

Example:

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

However, since Rake sees all my_task as the same task regardless of the args, it will only invoke the first time my_task[x] and will not invoke my_task[y] and my_task[z].

Using the Rake::Task#reenable method as mentioned in the other answers, I wrote a reenable Rake task which you can position to run after a task to allow it to run again.

Result:

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

I wouldn't say this is ideal but it works for my case.

reenable Rake task source:

task :reenable, [:taskname] do |_task, args|
  Rake::Task[args[:taskname]].reenable
  Rake::Task[:reenable].reenable
end
Igenia answered 16/6, 2020 at 17:12 Comment(0)
B
0

This worked for me, it's quite easy to understand you just need to loop you bash command.

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
Bryophyte answered 3/9, 2018 at 10:8 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.