2010-04-04 2 views
13

Я пишу сценарий Rake, который состоит из задач с аргументами. Я понял, как передать аргументы и как сделать задачу зависимой от других задач.Как передать аргументы из родительской задачи дочерней задаче в 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 
  • Могу ли я передать аргументы из родительской задачи в дочерних задачи?
  • Есть ли способ сделать дочерние задачи частными, чтобы их нельзя было вызывать самостоятельно?

ответ

26

Я действительно могу представить три способа передачи аргументов между задачами 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::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

Установка атрибутов, кажется, работает как шарм тоже.

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

# 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