Yaml conf फ़ाइलों में मर्ज हैश
YAML विन्यास फाइल लिखने के लिए काफी आसान है. प्राथमिक लाभ यह है कि, यह पाठ फ़ाइल की तरह पढ़ता है. वास्तव में अच्छी तरह से काम करता है अगर आपके config फाइल फ्लैट (कोई पदानुक्रम) और कोई repetitions के.
यदि repetitions के अपने विन्यास फाइल है तो यह समझ में आता है उन तत्वों को अलग करने और उन्हें पुनः प्रयोग. यह मैं क्या मतलब है - हम कहते हैं कि आप अपने config फाइल इस तरह दिखता है:
विकास: input_location: common_input output_location: dev_location मेल: smtp_server: your_server लॉगिन: your_login पासवर्ड: top_secret उत्पादन: input_location: common_input output_location: dev_location मेल: smtp_server: your_server लॉगिन: your_login पासवर्ड: top_secret
/ Tmp / test.yml के यहाँ कोड के ऊपर मान लिया जाये कि आप अजगर और गहरे लाल रंग में कैसे पढ़ सकते हैं
$cat readyml.py
# / Usr / bin / अजगर वातावरण pprint पीपी के रूप में आयात pprint से # Debian में अजगर yaml स्थापित करने की आवश्यकता है yaml आयात लोड, load_all के डंप से हैश = लोड (खुले ('/ tmp / test.yml के')) पीपी (हैश 'विकास'])
$ cat readyml.rb
# / Usr / bin / वातावरण माणिक 'पीपी' की आवश्यकता है हैश = :: लोड () File.open ('/ tmp / test.yml पढ़ें) YAML पीपी हैश ['विकास']
यहाँ रूबी संस्करण के लिए एक आसान एक लाइनर
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' या आप आईआरबी या अजगर कंसोल में एक ही कोशिश कर सकते हैं.
ध्यान दें कि उपरोक्त कोड स्निपेट में, सब कुछ अन्य की तुलना में उत्पादन विकास और उत्पादन के भाग में एक ही स्थान है. यह है, जहां yml नोड पहचानकर्ता बचाव के लिए आता है. डिफ़ॉल्ट मानों का एक सेट है और उन्हें अलग जगह पर ओवरराइड विचार सरल है.
आप इसे खींच अलग रूप में इस प्रकार हो सकता है:
चूक: चूक और input_location: common_input output_location: dev_location मेल: SENDER_NAME: प्रेषक smtp_server: your_server लॉगिन: your_login पासवर्ड: top_secret विकास: <<: * चूक उत्पादन: <<: * चूक output_location: prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
महान, यह (टीएम) काम करता है!.
बेशक हम जादू का एक बिट के लिए कुछ स्पष्टता कारोबार किया. यहाँ एक छोटा सा विवरण है: और, * और << और जो लंगर टैग नोड पहचानकर्ता के रूप में समझा जा सकता है, * नोड संदर्भ और << है: हैश मर्ज के लिए खड़ा है.
अधिक जानकारी के लिए या तो देखो yaml चश्मा या विकिपीडिया
अब तक तो अच्छा है लेकिन वहाँ एक पकड़ है, इन हैश मर्ज के पुनरावर्ती नहीं हैं. क्या इसका मतलब यह है: हम कहते हैं कि आप दो वातावरण में मेल के लिए अलग प्रेषक का नाम है करना चाहते हैं, तो आप निम्न कार्य करने के लिए परीक्षा हो सकती है:
चूक: चूक और input_location: common_input output_location: dev_location मेल: SENDER_NAME: प्रेषक smtp_server: your_server लॉगिन: your_login पासवर्ड: top_secret विकास: <<: * चूक मेल: SENDER_NAME: sender_dev उत्पादन: <<: * चूक output_location: prod_location मेल: SENDER_NAME: sender_prod
आओ हम जाँच
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
उफ़ समस्या, कुछ गलत हो गया था, इसके बाद के संस्करण के रूप में उल्लेख किया है कि हैश मर्ज पुनरावर्ती नहीं है और जबकि विलय यह उत्पादन का मेल है जो सिर्फ एक कुंजी है द्वारा डिफ़ॉल्ट मेल की जगह. / समाधान के आसपास काम करने के लिए एक अधिक स्तर उतारना है:
common_settings: और common_settings input_location: common_input output_location: dev_location mail_defaults: mail_defaults और SENDER_NAME: प्रेषक smtp_server: your_server लॉगिन: your_login पासवर्ड: top_secret चूक: चूक और <<: * Common_settings मेल: <<: * Mail_defaults विकास: <<: * चूक उत्पादन: <<: * चूक मेल: <<: * Mail_defaults SENDER_NAME: sender_prod
चलो फिर से जाँच करें
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
क्या आप कहते हैं कि आप घोंसले के शिकार का एक और स्तर है, अच्छी तरह से आप निश्चित रूप से एक अधिक स्तर उतारना कर सकते हैं, लेकिन तब यह एक गड़बड़ हो जाता है. तो, अगर आप एक conf फ़ाइल में हनोई के टावरों का हल लिखने की कोशिश नहीं कर रहे हैं, यह बेहतर है yaml या कुछ में खुदाई से conf फ़ाइल restucture. लेकिन है कि आपकी कॉल वैसे भी है.



































