2010-04-04 5 views
13

J'écris un script Rake qui consiste en des tâches avec des arguments. J'ai compris comment passer des arguments et comment rendre une tâche dépendante d'autres tâches.Comment transmettre des arguments de la tâche parente à la tâche enfant dans 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 
  • Puis-je transmettre les arguments de la tâche mère aux tâches de l'enfant?
  • Existe-t-il un moyen de rendre les tâches enfant privées afin qu'elles ne puissent pas être appelées indépendamment?

Répondre

26

Je peux réellement penser à trois façons de passer des arguments entre les tâches de Rake.

  1. Utilisation prise en charge intégrée de Rake pour les 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. invoquez directement des tâches 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. Une autre solution serait d'application principale de correctif singe Rake objet Rake::Application
    et l'utiliser pour stocker des valeurs arbitraires:

    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

attributs de réglage semble fonctionner comme un charme aussi.

Assurez-vous que la dépendance à la tâche est définie sur la tâche qui définit les attributs dont vous avez besoin.

# 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 
Questions connexes