2009-05-07 22 views
79

में एक निर्देशिका जोड़ना मैंने वर्तमान में $ LOAD_PATH (या $ :) में निष्पादित फ़ाइल की निर्देशिका जोड़ने के लिए दो सामान्य रूप से उपयोग की जाने वाली तकनीकों को देखा है। यदि आप एक मणि के साथ काम नहीं कर रहे हैं तो मुझे ऐसा करने के फायदे दिखाई देते हैं। एक दूसरे के मुकाबले ज्यादा वर्बोज़ लगता है, लेकिन क्या एक दूसरे के साथ जाने का कोई कारण है?

पहले वर्बोज़ विधि (overkill हो सकता है):

$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__))) 

और, और अधिक सरल-त्वरित और गंदी:

$:.unshift File.dirname(__FILE__) 

एक दूसरे के ऊपर के साथ जाने के किसी भी कारण?

+1

एक ** थोड़ा ** वर्बोज़ एक के कम वर्बोज़ संस्करण है:। 'File.expand_path (File.dirname (__ फ़ाइल __)) {नल | pwd | $ LOAD_PATH.unshift (pwd) जब तक $ LOAD_PATH.include? (Pwd)} ' –

+0

" जब तक "खंड के बारे में कैसे? उपर्युक्त दोनों कैसे समकक्ष हो सकते हैं? – inger

+0

किसी ऐसे व्यक्ति के रूप में जो यह समझने की कोशिश करने के लिए आया कि इसका उपयोग कैसे किया जाए, यह सुपर गुप्त है। मैं नहीं देखता कि उदाहरणों पर निर्देशिका का नाम कहां से आ रहा है। अगर कोई यह स्पष्ट कर सकता है तो मैं सराहना करता हूं। – SlySherZ

उत्तर

47

मैं कहूंगा कि $:.unshift File.dirname(__FILE__) के साथ दूसरे पर जाएं, क्योंकि मैंने $LOAD_PATH की तुलना में कोड में इसका अधिक उपयोग देखा है, और यह भी छोटा है!

+0

जब मैंने रूबी के साथ पहली बार शुरुआत की, तो मैंने स्पष्ट रूप से सोचा कि $ LOAD_PATH बेहतर था। लेकिन एक बार जब आप शुरुआती स्थिति से स्नातक हो जाते हैं, तो मैं केवल $ LOAD_PATH का उपयोग करता हूं अगर मैं अपने कोड को शुरुआत करने के लिए और अधिक पठनीय बनाने की कोशिश कर रहा था। मेह एक व्यापार बंद है। यह इस बात पर निर्भर करता है कि कोड "सार्वजनिक" कैसे है, जब तक स्मृति उपयोग प्रत्येक के लिए समान होता है, जिसे मैं अनिवार्य रूप से मानता हूं। –

+0

$ चेकिंग के बारे में कैसे करें: पहले से ही प्रविष्टि है? – inger

+4

आपके प्रोजेक्ट के लिए अनुसरण की जाने वाली शैली मार्गदर्शिका पर निर्भर करता है। लोकप्रिय [रूबी स्टाइल गाइड] (https://github.com/bbatsov/ruby-style-guide#syntax) "पर्ल-स्टाइल विशेष चर (जैसे $ :, $ ;, आदि) का उपयोग करने से बचें। वे हैं काफी गूढ़ और किसी भी चीज में उनका उपयोग लेकिन एक लाइनर स्क्रिप्ट को हतोत्साहित किया जाता है। " – bobmagoo

18

मैं 'त्वरित और गंदे' तरीके से बहुत शौकीन नहीं हूं। रूबी के लिए नया कोई भी विचार करेगा कि $:. क्या है।

मुझे यह और अधिक स्पष्ट लगता है।

libdir = File.dirname(__FILE__) 
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir) 

या यदि मैं पूर्ण पथ होने के बारे में परवाह ...

libdir = File.expand_path(File.dirname(__FILE__)) 
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir) 

अद्यतन 2009/09/10

देर के रूप में मैं निम्नलिखित कर रहा हूँ:

$:.unshift(File.expand_path(File.dirname(__FILE__))) unless 
    $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__))) 

मैंने इसे विभिन्न रूबी परियोजनाओं के पूरे समूह में देखा है जबकि बी GitHub पंक्तियाँ।

सम्मेलन होने लगता है?

+0

@LukeAntins, यह वास्तव में बहुत अच्छा है लेकिन मुझे एप्लिकेशन में load_path कहां से "बूटस्ट्रैप" करना चाहिए? – gaussblurinc

+0

@gaussblurinc कहीं भी आपके lib/application के शीर्ष के पास ', लेकिन यह वास्तव में निर्भर करता है। अगर आपके पास 'bin' फ़ाइल थी जो हमेशा आपके 'कोड' से संबंधित थी और यह केवल' bin 'फ़ाइल द्वारा चलाया गया था ... बिन में बूटस्ट्रैप।यदि आपके पास लाइब्रेरी है, तो आपके शीर्ष पर बूटस्ट्रैप 'lib/code.rb' में लाइब्रेरी कोड जैसे' lib/code /r 'के अंतर्गत सबकुछ तक पहुंचने के लिए है। उम्मीद है कि यह रैंबल मदद करता है! –

+0

रूबोकॉप मुझे सूचित करता है कि वर्तमान फ़ाइल की निर्देशिका के लिए पथ प्राप्त करने के लिए '__dir__' का उपयोग किया जा सकता है। – Raphael

136

रूबी लोड पथ को आमतौर पर $ के रूप में लिखा जाता है: लेकिन सिर्फ इसलिए कि यह छोटा है, इससे बेहतर नहीं होता है। यदि आप चतुरता के लिए स्पष्टता पसंद करते हैं, या यदि अपने स्वयं के लिए शव आपको खुजली देता है, तो आपको ऐसा करने की ज़रूरत नहीं है क्योंकि हर कोई है। का अभिवादन करें ...

$LOAD_PATH 

... और कहते हैं अलविदा करने के लिए ...

# I don't quite understand what this is doing... 
$: 
+25

इसके अलावा, "$:" जैसे तारों के लिए Google के लिए यह बहुत कठिन है जिसमें केवल प्रतीकों हैं। – DSimon

+35

@DSimon * $ * के लिए Google * नहीं, http://www.symbolhound.com/ – Sparhawk

7

आप अपने रेल परियोजना में script/console टाइप करें और $: दर्ज करते हैं, आप एक सरणी मिल जाएगा कि रुबी लोड करने के लिए आवश्यक सभी निर्देशिकाएं शामिल हैं। इस छोटे से अभ्यास से दूर लेना यह है कि $: एक सरणी है। ऐसा होने पर, आप unshift विधि या << ऑपरेटर के साथ अन्य निर्देशिकाओं को प्रीपेड करने जैसे कार्यों को निष्पादित कर सकते हैं। जैसा कि आपने अपने कथन $: और $LOAD_PATH में निहित किया है वही हैं।

आपके द्वारा वर्णित त्वरित और गंदे तरीके से करने का नुकसान यह है: यदि आपके पास पहले से ही आपके बूट पथ में निर्देशिका है, तो यह स्वयं को दोहराएगा।

उदाहरण:

मेरे पास एक प्लगइन है जिसे मैंने टोडो कहा है। मेरे निर्देशिका इसलिए की तरह संरचित है:

## In vendor/plugins/todo/rails/init.rb 
    %w{ models controllers models }.each do |dir| 
     path = File.expand_path(File.join(File.dirname(__FILE__), '../lib', 'app', dir)) 
     $LOAD_PATH << path 
     ActiveSupport::Dependencies.load_paths << path 
     ActiveSupport::Dependencies.load_once_paths.delete(path) 
    end 

नोट कैसे मैं कोड ब्लॉक बता तार करने के लिए ब्लॉक के अंदर कार्रवाई करने के लिए:

 
/---vendor 
    | 
    |---/plugins 
     | 
     |---/todo 
       | 
       |---/lib 
        | 
        |---/app 
          | 
          |---/models 
          |---/controllers 
       | 
       |---/rails 
        | 
        |---init.rb 

init.rb फ़ाइल में मैं निम्नलिखित कोड में प्रवेश किया 'मॉडल', 'नियंत्रक', और 'मॉडल', जहां मैं 'मॉडल' दोहराता हूं। (एफवाईआई, %w{ ... } रूबी को तारों की एक सरणी रखने के लिए बताने का एक और तरीका है)। जब मैं script/console चलाने के लिए, मैं निम्न लिखें:

>> puts $: 

और मैं इस टाइप करें ताकि यह आसान है स्ट्रिंग में सामग्री पढ़ने की। उत्पादन मैं मिलता है:

 
... 
... 
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models 
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/controllers 
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models 

आप देख सकते हैं, हालांकि यह रूप में सरल एक उदाहरण एक परियोजना मैं वर्तमान पर काम कर रहा हूँ का उपयोग करते समय मैं बना सकता है, अगर आप सावधान नहीं कर रहे हैं त्वरित और गंदी तरह से बार-बार पथ का नेतृत्व करेंगे। लंबा रास्ता बार-बार पथों की जांच करेगा और सुनिश्चित करेगा कि वे नहीं होते हैं।

यदि आप एक अनुभवी रेल प्रोग्रामर हैं, तो शायद आपके पास क्या हो रहा है और संभवतः पथ दोहराने की गलती नहीं करने का बहुत अच्छा विचार है। यदि आप नौसिखिया हैं, तो मैं लंबे समय तक जाऊंगा जबतक कि आप वास्तव में समझ नहीं लेते कि आप क्या कर रहे हैं।

+0

का उपयोग करें, आपकी प्रतिक्रिया बहुत उपयोगी और अच्छी तरह से समझाया गया है। सुझाए गए संपादन: विधि 'load_paths' और 'load_once_paths.delete' को बहिष्कृत कर दिया गया है। उन पंक्तियों को अपडेट करने में सहायता मिलेगी जो उन्हें संदर्भित करती हैं: 'ActiveSupport :: निर्भरता .autoload_paths << पथ' ' ActiveSupport :: Dependencies.autoload_once_paths.delete (पथ) ' – Uzzar

1

एक मणि है जो आपको अपने लोड पथ को अच्छे और क्लीनर कोड के साथ सेट करने देगा। इसे देखें: https://github.com/nayyara-samuel/load-path

यह भी अच्छा प्रलेखन

4

बेस्ट मैं जब Rspec का उपयोग कर रिश्तेदार पथ के माध्यम से एक निर्देशिका जोड़ने के लिए सामने आने वाले हैं। मुझे यह वर्बोज़ पर्याप्त लगता है लेकिन अभी भी एक अच्छा लाइनर है।

$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))