Zlučovanie hashe v Yamli conf súbory
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
- prenasledoval
- sřgemaskineoptimering
- Benjamin "balupton" Lupton



































