2010-03-28 16 views
33

मेरे पास एक रेक कार्य है जिसे मैंने नीचे सरलीकृत किया है। मैं विंडोज पर रूबी 1.9 का उपयोग कर रहा हूं।रेक कई कार्यों को लगातार क्यों नहीं डाल सकता है?

शायद आप नीचे रेक कार्य "list_all_levels" को कॉल करने के नतीजे अनुमान लगाना चाहते हैं? यह होना चाहिए:

"Hello level 1" 
"Hello level 2" 
"Hello level 3" 

लेकिन मेरे लिए अज्ञात कारणों से, यह केवल "हैलो लेवल 1" प्रिंट करता है और फिर बंद हो जाता है।

यही है, यह हमेशा केवल पहला कार्य आमंत्रित करता है। अगर मैं "42" तर्क पास करने के लिए पहली पंक्ति बदलता हूं, तो यह "हैलो लेवल 42" प्रिंट करेगा और फिर रुक जाएगा।

मुझे आश्चर्य है कि यह क्यों नहीं कार्य को 3 बार आमंत्रित करता है और सभी 3 लाइनों को प्रिंट करता है? और क्या यह काम करने के लिए कोई तरीका है कि मैं कैसे उम्मीद करूंगा?

task :list_all_levels => [] do 
    Rake::Task[:list].invoke 1 
    Rake::Task[:list].invoke 2 
    Rake::Task[:list].invoke 3 
end 

task :list, [:level] => [] do |t, args| 
    puts "Hello level #{args.level}" 
end 

उत्तर

47

मुद्दा यह है कि invoke केवल काम का आह्वान करता है, तो यह जरूरत है। रनिंग rake --trace पता चलता है:

 
(in /tmp/ruby) 
** Invoke default (first_time) 
** Execute default 
** Invoke list (first_time) 
** Execute list 
Hello level 1 
** Invoke list 
** Invoke list 

तो तुम यह काम :list दो बार आह्वान करने के लिए कोशिश कर रहा है देख सकते हैं। लेकिन एक बात आप कर सकते हैं करने के लिए मुख्य कार्य के शरीर बदलने के लिए है:

task :default => [] do 
    Rake::Task[:list].invoke 1 
    Rake::Task[:list].reenable 
    Rake::Task[:list].invoke 2 
    Rake::Task[:list].reenable 
    Rake::Task[:list].invoke 3 
end 

तो :list कार्य फिर से की जरूरत है और इसे सही ढंग से सभी 3 बयानों बाहर प्रिंट करता है।

क्लीनर जिस तरह से यह use execute rather than invoke है क्या करने के लिए:

task :default => [] do 
    Rake::Task[:list].execute 1 
    Rake::Task[:list].execute 2 
    Rake::Task[:list].execute 3 
end 

task :list, [:level] => [] do |t, args| 
    puts "Hello level #{args}" 
end 

अपने puts बयान बदलता है यही कारण है कि सिर्फ args बजाय args.level किसी कारण से उपयोग करने के लिए। उपरोक्त लिंक में वर्णित invoke से execute का उपयोग करने के साथ कुछ अन्य चेतावनी भी हैं।

+0

यह वास्तव में मेरा दिन बचा, धन्यवाद! – kizzx2

+2

इसे 'निष्पादित करें' @ पांडावुड में बदलने के साथ सावधान रहें क्योंकि वे बिल्कुल वही नहीं हैं => [रेक निष्पादन बनाम invoke] (http://chrisroos.co.uk/blog/2007-12-06-ruby-rake -इनवोक-बनाम निष्पादित) – Ron

+0

यह मेरे लिए बहुत प्रतिद्वंद्वी लगता है। कोई विचार है कि उन्होंने इसे ऐसा क्यों बनाया? – marcovtwout

6

आपको नए निष्पादन से पहले कार्य को पुन: सक्षम करने की आवश्यकता है, इसके लिए, आपको बस विधि को निष्पादित करने की आवश्यकता है। उपयोगकर्ता मार्क रशकॉफ की तरह उल्लेख किया।

Rake::Task[:list].reenable 
संबंधित मुद्दे