Zlučovanie hashe v Yamli conf súbory

31.júla 2009 od Prashant
Súbor pod: technológie

Yamli je veľmi užitočná pre písanie konfiguračných súborov. Hlavnou výhodou je to, že sa číta ako textový súbor. To funguje naozaj dobre, ak váš konfiguračný súbor je plochá (bez hierarchie) a nemá žiadne opakovanie.
Ak váš súbor obsahuje opakovanie konfigurácie, potom má zmysel oddeliť tieto prvky a ich znovu použiť. Čo chcem povedať je to - povedzme, že ste si konfiguračný súbor vyzerá takto:

  vývoj:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: vetva Váš_server
     Login: your_login
     heslo: top_secret
 produkcie:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: vetva Váš_server
     Login: your_login
     heslo: top_secret 

Za predpokladu, že vyššie uvedený kód do / tmp / test.yml tu je, ako si môžete prečítať v Python a Ruby
$cat readyml.py

 #! / Usr / bin / env python
 od dovozného pprint pprint ako pb
 # V Debianu je potrebné nainštalovať python-Yamli
 Yamli z dovozu zaťaženie, load_all výklopné
 hash = zaťaženie (open ("/ tmp / test.yml '))
 pp (hash ['vývoj']) 


$ cat readyml.rb

  #! / Usr / bin / env ruby
 vyžadujú "PP"
 hash = Yamli :: load (File.open ("/ tmp / test.yml"). čítať)
 pb hash ['vývoj'] 

tu je praktickým vložka verzia ruby
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' , alebo si môžete skúsiť to isté v IRB alebo python konzole.

Všimnite si, že vo vyššie uvedenom kódu, všetko je iné, než výstup poloha je rovnaká vo vývoji a výrobe časti. To je miesto, kde yml uzol identifikátor príde zachrániť. Myšlienka je jednoduchá mať sadu predvolených hodnôt a prepísať ich na inom mieste.
Dalo by sa vytiahnite ju od seba takto:

  predvolené: predvolené nastavenie a
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: odosielateľ
     smtp_server: vetva Váš_server
     Login: your_login
     heslo: top_secret
 vývoj:
   << * Východisková
 produkcie:
   << * Východisková
   output_location: prod_location 


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

Skvelé, to funguje (tm)!.
Pravdepodobne sa obchoduje nejakú prehľadnosť pre trochu mágie. Tu je malé vysvetlenie: a * a <<: a ktorý je kotva tag možno chápať ako identifikátor uzla, uzol * je referenčná a <<: kandiduje na hash zlúčenie.

Pre viac informácií viď buď Yamli špecifikácia alebo Wikipédie
Zatiaľ je to dobré, ale je tu jeden háčik, tieto mriežky sa spoja nie sú rekurzívne. Čo to znamená toto: povedzme, že chcete mať iné meno odosielateľa pre poštu v dvoch prostrediach, môžete byť v pokušení urobiť nasledovné:

  predvolené: predvolené nastavenie a
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: odosielateľ
     smtp_server: vetva Váš_server
     Login: your_login
     heslo: top_secret
 vývoj:
   << * Východisková
   mail:
     SENDER_NAME: sender_dev
 produkcie:
   << * Východisková
   output_location: prod_location
   mail:
     SENDER_NAME: sender_prod 

Umožňuje kontrolovať

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

Jejda, niečo sa pokazilo, problém ako je uvedené vyššie, je, že hash zlúčenie nie je rekurzívne a zatiaľ čo zlučovanie nahradil mailu zlyhanie poštou produkcie, ktoré má len jeden kľúč. Riešenia / práce okolo je rozvinúť ešte jednu úroveň:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  SENDER_NAME: odosielateľ
   smtp_server: vetva Váš_server
   Login: your_login
   heslo: top_secret

 predvolené: predvolené nastavenie a
   << * Common_settings
   mail:
     << * Mail_defaults
 vývoj:
   << * Východisková
 produkcie:
   << * Východisková
   mail:
     << * Mail_defaults
     SENDER_NAME: sender_prod

Umožňuje kontrolovať znova

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

Vedeli ste, že máte ešte jednu úroveň vnorenia, tak môžete určite rozbalí jeden stupeň, ale potom sa to stane neporiadok. Takže, ak nie ste sa snažia písať riešenie veže v Hanoji v conf súboru, je lepšie restucture conf súboru, než kopať do Yamli alebo niečo iné. Ale to je na vás tak ako tak.

Komentáre

  • Plné 453-stranový dokument tiež obsahuje priestor pre možné
    konsolidácie, vrátane privatizácie koše pickup, ktorý spája mesto a
    Wayne County zdravotné odbory a partnerstvo so školami Detroit na verejných
    rekreáciu. Návrh nezahŕňa žiadne ...

  • Človek oboznámený s dohodou povedal, že obe strany sú stále prepočte z názvu pre zlúčené spoločnosti. Ale tento človek povedal nápad zvažuje, je výber mena, ktorá nemá slovo "Deutsche" alebo skratku "NYSE" v ňom. ...

  • Jo to nepríjemné nesloučí rekurzívne. Bol som schopný urobiť riešenie v mojom balphp knižnice.

Blog Komentáre poháňané Disqus