Pinagsasama hashes sa yaml file Conf

Hulyo 31, 2009 sa pamamagitan ng prashant
File sa ilalim: teknolohiya

YAML ay lubos na madaling gamitin para sa pagsulat ng mga file ng configuration. Ang pangunahing bentahe ay na, ito bumabasa tulad ng text file. Talaga ito gumagana rin kung ang iyong config file ay flat (walang hierarchy) at may walang repetitions.
Kung ang iyong configuration file ay mga repetitions pagkatapos ito ang akma upang paghiwalayin ang mga elemento at muling gamitin ang mga ito. Ano ang ibig sabihin ko ay ito - sabihin natin mo ang iyong config file ay ganito ang hitsura:

  pag-unlad:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: your_server
     login: your_login
     password: top_secret
 produksyon:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: your_server
     login: your_login
     password: top_secret 

Ipagpalagay itaas code sa / tmp / test.yml na dito ay kung paano maaari mong basahin sa python at mapula
$cat readyml.py

 #! / Usr / bin / env sawa
 mula sa ng pprint import pprint ng pp
 # Sa Debian kailangan i-install ang python-yaml
 Sa mula yaml import ng pagkarga, dump load_all,
 hash = load (bukas ('/ tmp / test.yml na'))
 pp (hash ['pagbuo']) 


$ cat readyml.rb

  #! / Usr / bin / env rubi
 nangangailangan ng 'pp'
 hash = YAML :: load (File.open ('/ tmp / test.yml na'). basahin)
 pp hash ['pagbuo'] 

dito ay isang madaling isa liner para sa rubi bersyon
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' o maaari mong subukan ang parehong sa irb o python console.

Tandaan na sa itaas na snippet ng code, ang lahat ay iba na output lokasyon ay parehong sa bahagi ng pag-unlad at produksyon. Ito ay kung saan yml node identifier pagdating sa iligtas. Ang ideya ay simpleng magkaroon ng isang hanay ng mga halaga ng default at sapawan ang mga ito sa ibang lugar.
Maaari mong hilahin hatiin ito bilang mga sumusunod:

  default: & default
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: nagpadala
     smtp_server: your_server
     login: your_login
     password: top_secret
 pag-unlad:
   <<: * Default
 produksyon:
   <<: * Default
   output_location: prod_location 


$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$

Mahusay, ito gumagana (tm)!.
Arguably namin traded ilang kalinawan para sa isang bit ng magic. Narito ang isang maliit na paliwanag: &, * at <<: & na ang tag ng anchor ay maaaring maunawaan bilang node identifier, * ay node reference at <<: ibig sabihin para sa hash sumanib.

Para sa karagdagang detalye makita alinman yaml na panoorin o Wikipedia
Sa ngayon kaya magandang ngunit may catch dito, ang mga hash mga merges ay hindi recursive. Ano ang ibig sabihin nito ay ito: sabihin natin na nais mong magkaroon ng iba't ibang pangalan ng nagpadala para sa mail sa dalawang kapaligiran, maaaring tempted upang gawin ang mga sumusunod:

  default: & default
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: nagpadala
     smtp_server: your_server
     login: your_login
     password: top_secret
 pag-unlad:
   <<: * Default
   mail:
     SENDER_NAME: sender_dev
 produksyon:
   <<: * Default
   output_location: prod_location
   mail:
     SENDER_NAME: sender_prod 

Hinahayaan suriin

$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$

Oops, isang bagay nagpunta mali, ang problema gaya ng nabanggit sa itaas ay na ang hash sumanib ay hindi recursive at habang pinagsasama ang pinalitan ito ang mail ng default sa pamamagitan ng koreo ng produksyon na kung saan ay may isa sa key lamang. Solusyon / trabaho sa paligid ay sa magkadkad isa pang antas:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  SENDER_NAME: nagpadala
   smtp_server: your_server
   login: your_login
   password: top_secret

 default: & default
   <<: * Common_settings
   mail:
     <<: * Mail_defaults
 pag-unlad:
   <<: * Default
 produksyon:
   <<: * Default
   mail:
     <<: * Mail_defaults
     SENDER_NAME: sender_prod

Hinahayaan muling suriin

$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$

Ang sinabi mo mayroon kang isa pang antas ng nesting, well maaari mong tiyak magkadkad isa pang antas, ngunit pagkatapos ay ito ay nagiging isang gulo. Kaya, kung hindi sinusubukan mong isulat ang solusyon sa tower ng Hanoi sa isang Conf file, ito ay mas mahusay sa restucture Conf file sa paghuhukay sa yaml o iba pa. Ngunit na ay pa rin ang iyong tawag.

Mga komento

  • Ang buong 453-pahina na dokumento rin ay naglilista ng mga potensyal na lugar para sa
    pagpapatatag, kabilang ang privatizing basura trak, pinagsasama ang mga lungsod at
    Wayne County ang mga kagawaran ng kalusugan at partnering sa Detroit Pampublikong Paaralan sa
    libangan. Panukala ay hindi isama ang anumang ...

  • Ang isang tao na pamilyar sa pakikitungo sinabi ng dalawang panig pa rin ay-hashing ang isang pangalan para sa isang pinagsamang kompanya. Subalit sinabi ng taong ito ang isang ideya na isinasaalang-alang ang pagpili ng isang pangalan na hindi ang salitang "Deutsche" o acronym na "NYSE" sa loob nito. ...

  • Oo nakakainis na ito ay hindi sumanib recursively. Ako ay magagawang gumawa ng isang workaround sa aking balphp na library.

mga komento sa blog na pinapatakbo sa pamamagitan ng Disqus