2012-09-11 7 views
14

invoke एक लूप more than once के भीतर से एक ही रेक कार्य संभव नहीं है। लेकिन, मैं rake first पर कॉल करने और एक सरणी के माध्यम से लूप करने में सक्षम होना चाहता हूं और विभिन्न तर्कों के साथ प्रत्येक पुनरावृत्ति पर second का आह्वान करना चाहता हूं। चूंकि invoke केवल पहली बार निष्पादित हो जाता है, मैंने execute का उपयोग करने का प्रयास किया, लेकिन Rake::Task#execute splat (*) ऑपरेटर का उपयोग नहीं करता है और केवल एक ही तर्क लेता है। इसके चारों ओरमैं कई बार तर्क के साथ रेक कार्यों को कैसे निष्पादित करूं?

desc "first task" 
task :first do 
    other_arg = "bar" 
    [1,2,3,4].each_with_index do |n,i| 
    if i == 0 
     Rake::Task["foo:second"].invoke(n,other_arg) 
    else 
     # this doesn't work 
     Rake::Task["foo:second"].execute(n,other_arg) 
    end 
    end 
end 

task :second, [:first_arg, :second_arg] => :prerequisite_task do |t,args| 
    puts args[:first_arg] 
    puts args[:second_arg] 
    # ... 
end 

एक हैक एक सरणी में execute तर्क डाल करने के लिए और second में आर्ग की संरचना की जांच है, लेकिन यह, लगता है अच्छी तरह से, hackish। क्या मैं ऐसा करने के लिए एक और (बेहतर?) तरीका है जो मैं करना चाहता हूं?

उत्तर

19

आप रेक :: कार्य # पुन: उपयोग करने योग्य इसे पुन: उपयोग करने की अनुमति देने के लिए उपयोग कर सकते हैं।

desc "first task" 
task :first do 
    other_arg = "bar" 
    [1,2,3,4].each_with_index do |n,i| 
    if i == 0 
     Rake::Task["second"].invoke(n,other_arg) 
    else 
     # this does work 
     Rake::Task["second"].reenable 
     Rake::Task["second"].invoke(n,other_arg) 
    end 
    end 
end 

task :second, [:first_arg, :second_arg] do |t,args| 
    puts args[:first_arg] 
    puts args[:second_arg] 
    # ... 
end 

$ रेक पहले

1 
bar 
2 
bar 
3 
bar 
4 
bar 
+0

वह चिकना दिखता है। धन्यवाद! –

4

execute समारोह एक पैरामीटर के रूप में एक Rake::TaskArguments के लिए पूछता है, इस कारण है कि यह केवल एक ही तर्क को स्वीकार करता है।

You could use

stuff_args = {:match => "HELLO", :freq => '100' } 
Rake::Task["stuff:sample"].execute(Rake::TaskArguments.new(stuff_args.keys, stuff_args.values)) 

हालांकि, आह्वान और अमल में एक और अंतर है पर अमल नहीं चलता है: prerequisite_task जब आह्वान यह पहली करता है, तो नारा है और फिर से सक्षम या निष्पादित वास्तव में एक ही अर्थ नहीं है ।

संबंधित मुद्दे