Search code examples
rubycommand-linerakecommand-line-arguments

How to pass command line arguments to a rake task


I have a rake task that needs to insert a value into multiple databases.

I'd like to pass this value into the rake task from the command line, or from another rake task.

How can I do this?


Solution

  • Options and dependencies need to be inside arrays:

    namespace :thing do
      desc "it does a thing"
      task :work, [:option, :foo, :bar] do |task, args|
        puts "work", args
      end
      
      task :another, [:option, :foo, :bar] do |task, args|
        puts "another #{args}"
        Rake::Task["thing:work"].invoke(args[:option], args[:foo], args[:bar])
        # or splat the args
        # Rake::Task["thing:work"].invoke(*args)
      end
    
    end
    

    Then

    rake thing:work[1,2,3]
    => work: {:option=>"1", :foo=>"2", :bar=>"3"}
    
    rake thing:another[1,2,3]
    => another {:option=>"1", :foo=>"2", :bar=>"3"}
    => work: {:option=>"1", :foo=>"2", :bar=>"3"}
    

    NOTE: variable task is the task object, not very helpful unless you know/care about Rake internals.

    RAILS NOTE:

    If running the task from Rails, it's best to preload the environment by adding => [:environment] which is a way to setup dependent tasks.

      task :work, [:option, :foo, :bar] => [:environment] do |task, args|
        puts "work", args
      end