2010-04-04 16 views
13

Argümanlı görevlerden oluşan bir Rake betiği yazıyorum. Argümanların nasıl geçileceğini ve bir göreve diğer görevlere nasıl bağımlı hale getirileceğini anladım.Bağımsız görevden bağımsız görevlere Rake'deki alt görevle nasıl geçebilirim?

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 
  • Ben çocuk görevlere ana görevden argümanları uzatabilir mi?
  • Çocukların görevlerini özel olarak yapmaları için bir yol var mı?

cevap

26

Aslında, Rake görevleri arasında bağımsız değişkenleri iletmenin üç yolunu düşünebilirim.

  1. Kullanım Rake yerleşik görüşleri destekler:

    # 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. Doğrudan Rake::Task#invoke aracılığıyla görevleri çağırmak:

    # 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. Başka bir çözüm maymun yama Rake ana uygulama nesnesine Rake::Application olacaktır
    ve aritmetik değerleri saklamak için kullanın:

    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

Ayar nitelikleri de bir cazibe gibi çalışıyor gibi görünüyor.

Sadece görev bağımlılığının, gereksinim duyduğunuz öznitelikleri belirleyen göreve ayarlandığından emin olun.

# 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