2010-08-27 19 views
23

पर एकाधिक पैरामीटर कैसे पास करें I एकाधिक पैरामीटर पास करना चाहते हैं लेकिन मुझे संख्याएं नहीं पता हैं। मॉडल नाम जैसे। मैं उन पैरामीटर को रेक कार्य में कैसे पास करूं और मैं रेक कार्य के अंदर उन पैरामीटर को कैसे एक्सेस करूं?रेक कार्य

की तरह, $ rake test_rake_task[par1, par2, par3]

उत्तर

9

आप ऐसा ही कुछ कोशिश कर सकते हैं: बिना

values = ENV['SOME_PARAM'].split(',') 
+0

मैं पारित नहीं हो सकता इस तरह पैरामीटर ?? रेक test_rake_task [par1, par2, par3] और इसे एक्सेस करें ?? –

+0

मैंने रेक कार्य के पैरामीटर को पारित करने के लिए एकमात्र तरीका बताया है। यह 'रेक टेस्ट_रेक_टस्क [पैरा 1, पैरा 2, पैरा 3]' जैसे कुछ के साथ रेक कार्य निष्पादित करने के लिए असंभव है। – lest

+0

रेक कार्य को निष्पादित करना असंभव नहीं है, हेनरी का उत्तर नीचे ऐसा करने के लिए काम करता है। –

53

रैक एक सरणी का उपयोग कर एक काम करने के लिए सीधे पैरामीटर प्रदान करने का समर्थन करता है,:

rake test_rake_task SOME_PARAM=value1,value2,value3 

और रेक कार्य में एनएनवी हैक का उपयोग कर।

इस तरह अपने कार्य को परिभाषित करें:

task :my_task, [:first_param, :second_param] => :environment do |t, args| 
    puts args[:first_param] 
    puts args[:second_param] 
end 

और यह इस तरह कहते हैं:

rake my_task[Hello, World] 
=> Hello 
    World 

This article by Patrick Reagan on the Viget blog explains it nicely

+12

इसने सवाल का जवाब नहीं दिया। ओपी का कहना है कि वह पारित तर्कों की संख्या को नहीं जानता है। –

+1

@ हेनरी क्या आप कृपया 'जरूरतों' के अर्थ/उपयोग का वर्णन कर सकते हैं या इस प्रतीक पर दस्तावेज़ीकरण प्रदान कर सकते हैं? – JJD

+1

@JJD यदि आप रूबी के नवीनतम संस्करण का उपयोग कर रहे हैं, तो मुझे लगता है: जरूरतों को हटा दिया गया है। : संकेत निर्भरता की जरूरत है। 'कार्य: परीक्षण, [: arg1,: arg2] =>: पर्यावरण do | t, args जैसे कुछ आज़माएं। # कोड अंत ' – TradeRaider

8

उपयोग args.values।

task :events, 1000.times.map { |i| "arg#{i}".to_sym } => :environment do |t, args| 
    Foo.use(args.values) 
end 
+0

* args.to_hash.values ​​* का उपयोग करने की आवश्यकता है, और एक हजार 4-अक्षर तर्क उत्पन्न * रेक-टी *, इसलिए मैंने * (? A ..? E) .to_a * का उपयोग किया। – michelpm

7

इस blog post पर इस उदाहरण मिले और वाक्य रचना थोड़ा क्लीनर लगता है।

उदाहरण के लिए, यदि आप एक say_hello काम किया था, आप इसे बहस के किसी भी संख्या के साथ कह सकते हैं, तो जैसे:

task :say_hello do 
    # ARGV contains the name of the rake task and all of the arguments. 
    # Remove/shift the first element, i.e. the task name. 
    ARGV.shift 

    # Use the arguments 
    puts 'Hello arguments:', ARGV 

    # By default, rake considers each 'argument' to be the name of an actual task. 
    # It will try to invoke each one as a task. By dynamically defining a dummy 
    # task for every argument, we can prevent an exception from being thrown 
    # when rake inevitably doesn't find a defined task with that name. 
    ARGV.each do |arg| 
    task arg.to_sym do ; end 
    end 

end 
+0

साइड इफेक्ट: आप एक के साथ अन्य कार्यों का उपयोग करने में सक्षम नहीं होंगे – Sergey

43

आप उपयोग कर सकते हैं:

$ rake say_hello Earth Mars Venus 

यह यह कैसे काम करता है args.extras स्पष्ट रूप से यह बताते हुए कि आपके पास कितने पैरामीटर हैं, सभी तर्कों पर फिर से शुरू करने के लिए।

उदाहरण:

desc "Bring it on, parameters!" 
task :infinite_parameters do |task, args| 
    puts args.extras.count 
    args.extras.each do |params| 
     puts params 
    end   
end 

चलाने के लिए:

rake infinite_parameters['The','World','Is','Just','Awesome','Boomdeyada'] 

आउटपुट:

6 
The 
World 
Is 
Just 
Awesome 
Boomdeyada 
+1

बिना किसी नामांकित पैरामीटर को पर्यावरण हैकिंग के बिना रेक रेक में पास करने का सबसे अच्छा तरीका। – Epigene

+1

नोट यह रेक (या कम) रेक के हाल के संस्करणों के लिए सच है। –

+2

यह निश्चित रूप से जवाब होना चाहिए। – Siraris

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