2010-06-19 7 views
5

मैं आंतरिक उपयोग के लिए एक मणि बना रहा हूँ। इसे में, मैं एक निर्देशिका से कुछ YAML लोड:रूबी में एक विशिष्ट सापेक्ष पथ से फ़ाइलों को कैसे लोड करूं?

# in <project_root>/bin/magicwand 
MagicWand::Configuration::Initializer.new(...) 

# in <project_root>/lib/magicwand/configuration/initializer.rb 
root_yaml = YAML.load_file(
    File.expand_path("../../../../data/#{RootFileName}", __FILE__)) 

# in <project_root>/data/root.yaml 
--- 
apple: 100 
banana: 200 
coconut: 300 

मैं नहीं बल्कि initializer.rb करने के लिए data/root.yaml रिश्तेदार के स्थान पर निर्भर नहीं होता। इसके बजाय, मैं <project_root> का संदर्भ प्राप्त करूंगा और वहां से संबंधित पथ पर निर्भर करता हूं, जो एक स्मार्ट चाल की तरह लगता है।

सबसे पहले, क्या इस बारे में जाने का सबसे अच्छा तरीका है? दूसरा, यदि हां, तो मैं यह कैसे कर सकता हूं? मैंने विभिन्न File विधियों की जांच की, लेकिन मुझे नहीं लगता कि ऐसा कुछ भी है। मैं रूबी 1.9 का उपयोग कर रहा हूँ।

अभी, मैं एक विशेष लगातार बना सकते हैं और है कि बजाय पर निर्भर करते हैं:

# in lib/magicwand/magicwand.rb 
module MagicWand 
    # Project root directory. 
    ROOT = File.expand_path("../..", __FILE__) 
end 

लेकिन मुझे यकीन है कि मैं या तो उस दृष्टिकोण पसंद नहीं कर रहा हूँ।

उत्तर

4

यदि कोई मुख्य फ़ाइल है जिसे आप हमेशा चलाते हैं तो आप उस फ़ाइल को संदर्भ बिंदु के रूप में उपयोग कर सकते हैं। रिश्तेदार रास्ता है कि फ़ाइल के (वर्तमान निर्देशिका और के बीच) $0 में हो जाएगा, तो (यह मानते हुए कि मुख्य फ़ाइल और root.yaml के बीच सापेक्ष पथ है) तुम क्या

path_to_root_yaml = File.dirname($0) + '/data/root.yaml' 
+0

एक है कि data/root.yaml के सापेक्ष पथ प्राप्त करने के लिए अच्छा विचार है, लेकिन यह परीक्षण के दौरान तोड़ देगा, जब मैं अक्सर पूर्ण अनुप्रयोग स्टैक को फायर करने के बजाए कक्षाओं को सीधे परीक्षण करता हूं। ऐसे मामलों में मेरा '$ 0' अलग होगा (परीक्षण धावक का मार्ग, मेरा आवेदन नहीं)। –

+0

एक साधारण ऑब्जेक्ट में लुकअप लपेटें जिसे आप परीक्षण के दौरान बाहर निकाल सकते हैं। – Theo

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