Yaml conf फ़ाइलों में मर्ज हैश

31 जुलाई, 2009 के द्वारा प्रशांत · टिप्पणियाँ
: के तहत दायर की प्रौद्योगिकी

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. लेकिन है कि आपकी कॉल वैसे भी है.