2010-12-01 10 views
48

require File.expand_path(..., __FILE__) एक परियोजना के भीतर अन्य फाइलों की आवश्यकता के लिए सबसे अच्छा तरीका है?फ़ाइल.expand_path (..., __FILE__) की आवश्यकता है सर्वोत्तम अभ्यास?

+0

मैं +100 इस चाहते हैं, तो मैं कर सकता। यह मेरी इच्छा है कि मैं बिना कर सकता हूं। –

+0

http://stackoverflow.com/questions/224379/what-does-file-mean-in-ruby –

+0

की [रूबी संभव डुप्लिकेट की संभावित डुप्लिकेट: बनाम की आवश्यकता होती है की आवश्यकता होती है \ _relative - सबसे अच्छा अभ्यास दोनों रूबी <1.9.2 and > में चल रहे वैकल्पिक हल के लिए = 1.9.2] (http://stackoverflow.com/questions/4333286/ruby-require-vs-require-relative-best-practice-to-workaround-running-in-both) –

उत्तर

35

रूबी में 1.9.2 + require_relative शायद ऐसा करने का अधिक सही तरीका है।

require को सुरक्षा कारणों से आपकी '.' निर्देशिका शामिल नहीं किया गया था। require_relative को आपके कॉलिंग स्क्रिप्ट के पथ से संबंधित मॉड्यूल के लिए स्थानीय-फ़ाइल समाधान प्रदान करने के लिए जोड़ा गया था।

आप search here on StackOverflow, विशेष रूप से "What is require_relative in Ruby?" में, और internets और उपयोग की चाल और why-for messages बता सकते हैं कि यह कैसा रहा।

+2

इसके अलावा, "[रूबी: बनाम आवश्यकता है require_relative - रूबी <1.9.2 and > = 1.9.2 दोनों में काम करने के लिए सबसे अच्छा अभ्यास (http://stackoverflow.com/questions/4333286/ruby-require-vs-require-relative-best-practice-to-workaround-running-in -बोथ) "यह एक महान धागा समझा रहा है। –

3

जब तक आप $LOAD_PATH संशोधित नहीं करते हैं, तो यह एक अच्छा विचार होगा यदि आप एक ही निर्देशिका संरचना से लोड करते रहें, तो आप इसे इस तरह से कर रहे हैं।

तरह से मैं यह करने के लिए लिया है, बातें, के रूप में कर रहे हैं संभव के रूप में पार मंच सुनिश्चित करने के लिए यह है:

require File.expand_path(File.join(*%w[ ... ]), File.dirname(__FILE__)) 

यह थोड़ा वर्बोज़ है, लेकिन यह कम से कम पथ और परिणाम ज्यादातर मामलों में कम से कम वाक्यविन्यास fluff।

एक अधिक सटीक उदाहरण होगा:

require File.expand_path(File.join(*%w[ .. lib example ]), File.dirname(__FILE__)) 

आप चीजों को आप फ़ाइलों का एक बहुत लोड कर रहे हैं, तो सरल करने के लिए $LOAD_PATH करने के लिए एक संशोधन के साथ इस गठबंधन और यह कर सकते हैं:

$LOAD_PATH << File.expand_path(File.join(*%w[ .. lib ]), File.dirname(__FILE__)) 

require 'example' 
2

रुबी 1.8.x में, जहां आपके पास require_relative कोर में नहीं है, File.expand_path(...,__FILE__) काम नहीं करेगा।

मान लीजिए __FILE__ == "/home/yourname/foo.rb"File.expand_path("bar.rb",__FILE__)"/home/yourname/foo.rb/bar.rb देता है।

तुम क्या चाहते File.expand_path("bar.rb",File.dirname(__FILE__)) जो "/home/yourname/bar.rb"

रिटर्न तुम भी backports gem से require_relative मिल सकता है।

+0

आप हमेशा उसी निर्देशिका में foo.rb से baz.rb को शामिल करने के लिए फ़ाइल.expand_path ("../ baz.rb", __FILE __) की आवश्यकता होती है। –

+0

मैट की टिप्पणी के बाद, मैं देखता हूं कि 'file.expand_path ("../../ lib/mygem.rb", __FILE __) '2.1_ डॉक्स में' expand_path' के लिए दिया गया एक वास्तविक उदाहरण है।लेकिन इसमें एक गैर-निर्देशिका का बहाना शामिल है एक निर्देशिका है और फिर अपने माता-पिता के पास जा रही है! मुझे परेशान है कि आधिकारिक दस्तावेज़ इस तरह के एक भयानक दृष्टिकोण की सिफारिश करेंगे, और मुझे आश्चर्य है कि यह केवल कार्यान्वयन के कुछ भंगुर दुष्प्रभावों के माध्यम से काम करता है जो भविष्य के संस्करणों में व्यवहार को बदल सकता है। मुझे लगता है कि 'dirname' दृष्टिकोण बहुत साफ है। –

6

रूबी 2.0 में आप उपयोग कर सकते हैं Kernel#__dir__

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