How to pass command line arguments to a rake task

后端 未结 19 2140
走了就别回头了
走了就别回头了 2020-11-22 10:13

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

19条回答
  •  [愿得一人]
    2020-11-22 10:45

    You can specify formal arguments in rake by adding symbol arguments to the task call. For example:

    require 'rake'
    
    task :my_task, [:arg1, :arg2] do |t, args|
      puts "Args were: #{args} of class #{args.class}"
      puts "arg1 was: '#{args[:arg1]}' of class #{args[:arg1].class}"
      puts "arg2 was: '#{args[:arg2]}' of class #{args[:arg2].class}"
    end
    
    task :invoke_my_task do
      Rake.application.invoke_task("my_task[1, 2]")
    end
    
    # or if you prefer this syntax...
    task :invoke_my_task_2 do
      Rake::Task[:my_task].invoke(3, 4)
    end
    
    # a task with prerequisites passes its 
    # arguments to it prerequisites
    task :with_prerequisite, [:arg1, :arg2] => :my_task #<- name of prerequisite task
    
    # to specify default values, 
    # we take advantage of args being a Rake::TaskArguments object
    task :with_defaults, :arg1, :arg2 do |t, args|
      args.with_defaults(:arg1 => :default_1, :arg2 => :default_2)
      puts "Args with defaults were: #{args}"
    end
    

    Then, from the command line:

    > rake my_task[1,false]
    Args were: {:arg1=>"1", :arg2=>"false"} of class Rake::TaskArguments
    arg1 was: '1' of class String
    arg2 was: 'false' of class String
    
    > rake "my_task[1, 2]"
    Args were: {:arg1=>"1", :arg2=>"2"}
    
    > rake invoke_my_task
    Args were: {:arg1=>"1", :arg2=>"2"}
    
    > rake invoke_my_task_2
    Args were: {:arg1=>3, :arg2=>4}
    
    > rake with_prerequisite[5,6]
    Args were: {:arg1=>"5", :arg2=>"6"}
    
    > rake with_defaults
    Args with defaults were: {:arg1=>:default_1, :arg2=>:default_2}
    
    > rake with_defaults['x','y']
    Args with defaults were: {:arg1=>"x", :arg2=>"y"}
    

    As demonstrated in the second example, if you want to use spaces, the quotes around the target name are necessary to keep the shell from splitting up the arguments at the space.

    Looking at the code in rake.rb, it appears that rake does not parse task strings to extract arguments for prerequisites, so you can't do task :t1 => "dep[1,2]". The only way to specify different arguments for a prerequisite would be to invoke it explicitly within the dependent task action, as in :invoke_my_task and :invoke_my_task_2.

    Note that some shells (like zsh) require you to escape the brackets: rake my_task\['arg1'\]

提交回复
热议问题