2010-04-04 15 views
13

मैं एक रेक स्क्रिप्ट लिख रहा हूं जिसमें तर्कों के साथ कार्य शामिल हैं। मैंने तर्क दिया कि तर्क कैसे पारित करें और कार्य को अन्य कार्यों पर कैसे निर्भर किया जाए।मैं मूल कार्य से रेक में बाल कार्य में तर्क कैसे पास करूं?

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

मैं वास्तव में रेक कार्यों के बीच तर्क पारित करने के तीन तरीकों के बारे में सोच सकता हूं।

  1. रैक उपयोग के अंतर्निहित तर्क के लिए समर्थन:

    # 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 
संबंधित मुद्दे