Search code examples
rubyrake

How do I execute Rake tasks with arguments multiple times?


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?


Solution

  • 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