Как передать аргументы из родительской задачи в дочернюю задачу в Rake? - PullRequest
13 голосов
/ 04 апреля 2010

Я пишу скрипт Rake, который состоит из задач с аргументами. Я выяснил, как передавать аргументы и как сделать задачу зависимой от других задач.

task :parent, [:parent_argument1, :parent_argument2, :parent_argument3] => [:child1, :child2] do
  # Perform Parent Task Functionalities
end

task :child1, [:child1_argument1, :child1_argument2] do |t, args|
  # Perform Child1 Task Functionalities
end

task :child2, [:child2_argument1, :child2_argument2] do |t, args|
  # Perform Child2 Task Functionalities
end
  • Можно ли передать аргументы из родительской задачи в дочерние задачи?
  • Есть ли способ сделать дочерние задачи частными, чтобы их нельзя было вызывать независимо?

Ответы [ 2 ]

26 голосов
/ 09 апреля 2010

Я действительно могу придумать три способа передачи аргументов между задачами Rake.

  1. Используйте встроенную поддержку Rake для аргументов:

    # 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. Непосредственный вызов задач через 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. Другим решением было бы исправление обезьянки основного объекта приложения Rake Rake :: Application
    и использовать его для хранения произвольных значений:

    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 голосов
/ 21 мая 2014

Настройка атрибутов, похоже, тоже работает как шарм.

Просто убедитесь, что зависимость задачи установлена ​​для задачи, которая задает необходимые вам атрибуты.

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...