How do I pass arguments from the parent task to the child task in Rake?

前端 未结 2 735
盖世英雄少女心
盖世英雄少女心 2021-02-02 00:15

I am writing a Rake script which consists of tasks with arguments. I figured out how to pass arguments and how to make a task dependent on other tasks.

task :pa         


        
相关标签:
2条回答
  • 2021-02-02 00:50

    I can actually think of three ways for passing arguments between Rake tasks.

    1. Use Rake’s built-in support for arguments:

      # accepts argument :one and depends on the :second task.
      task :first, [:one] => :second do |t, args|
        puts args.inspect  # => '{ :one => "one" }'
      end
      
      # argument :one was automagically passed from task :first.
      task :second, :one do |t, args|
        puts args.inspect  # => '{ :one => "one" }'
      end
      
      $ rake first[one]
      
    2. Directly invoke tasks via Rake::Task#invoke:

      # accepts arguments :one, :two and passes them to the :second task.
      task :first, :one, :two do |t, args|
        puts args.inspect  # => '{ :one => "1", :two => "2" }'
        task(:second).invoke(args[:one], args[:two])
      end
      
      # accepts arguments :third, :fourth which got passed via #invoke.
      # notice that arguments are passed by position rather than name.
      task :second, :third, :fourth do |t, args|
        puts args.inspect  # => '{ :third => "1", :fourth => "2" }'
      end
      
      $ rake first[1, 2]
      
    3. Another solution would be to monkey patch Rake’s main application object Rake::Application
      and use it to store arbitary values:

      class Rake::Application
        attr_accessor :my_data
      end
      
      task :first => :second do
        puts Rake.application.my_data  # => "second"
      end
      
      task :second => :third do
        puts Rake.application.my_data  # => "third"
        Rake.application.my_data = "second"
      end
      
      task :third do
        Rake.application.my_data = "third"
      end
      
      $ rake first
      
    0 讨论(0)
  • 2021-02-02 00:53

    Setting attributes seems to work like a charm too.

    Just ensure the the task dependency is set to the task that sets the attributes you need.

    # set the attribute I want to use in another task
    task :buy_puppy, [:name] do |_, args|
      name = args[:name] || 'Rover'
      @dog = Dog.new(name)
    end
    
    # task I actually want to run
    task :walk_dog => :buy_puppy do
      @dog.walk
    end
    
    0 讨论(0)
提交回复
热议问题