Spajanje hashes u yaml boys = dječaci datoteka
YAML je vrlo zgodan za pisanje konfiguracijske datoteke. Osnovna prednost je da se čita kao tekstualnu datoteku. To radi jako dobro ako je vaša config file je flat (nema hijerarhije) i nema ponavljanja.
Ako je Vaš konfiguracije datoteka ima ponavljanja onda ima smisla izdvojiti one elemente te ih ponovno. Što mislim je to - recimo da vaša config file izgleda ovako:
razvoj: input_location: common_input output_location: dev_location mail: smtp_server: your_server login: your_login lozinka: top_secret Proizvodnja: input_location: common_input output_location: dev_location mail: smtp_server: your_server login: your_login lozinka: top_secret
Uz pretpostavku iznad koda u / tmp / test.yml ovdje je kako možete pročitati u Pythonu i Ruby
$cat readyml.py
#! / Usr / bin / env python pprint iz uvoza pprint kao pp # U Debian morati instalirati python-yaml yaml iz uvoza tereta, load_all, izvatkom hash = load (open ("/ tmp / test.yml ')) pp (hash ['razvoj'])
$ cat readyml.rb
#! / Usr / bin / env rubin zahtijevaju možeš PP kontakta hash = YAML :: load (File.open ("/ tmp / test.yml '). pročitati) pp hash ['razvoj']
ovdje je pri ruci jedan brod za rubin verziji
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' ili možete isprobati isti u IRB ili python konzola.
Imajte na umu da u gore isječak koda, sve je osim izlaza lokacija je ista u razvoju i proizvodnji dio. Ovo je mjesto gdje yml čvora identifikator dolazi spasiti. Ideja je jednostavna imati set zadanih vrijednosti te ih nadjačati, na drugom mjestu.
Možete ga razvlači kako slijedi:
zadane: & defaultno input_location: common_input output_location: dev_location mail: SENDER_NAME: pošiljatelj smtp_server: your_server login: your_login lozinka: top_secret razvoj: <<: * Defaultno Proizvodnja: <<: * Defaultno output_location: prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Super, to radi (tm)!.
Uvjerljivo smo trgovali neke jasnoću za malo magije. Ovdje je malo objašnjenje: i, * i <<: i što je sidro tag se može shvatiti kao čvora identifikator, * je čvor referentni i <<: kratica za hash spajanja.
Za više pojedinosti vidi bilo yaml naočale ili Wikipedia
Do sada je tako dobro, ali postoji kvaka ovdje, ove hash stapa nisu rekurzivni. Što to znači da je ovo: recimo da želite imati drugačiji naziv pošiljatelja pošte u dva okruženja, vi svibanj biti u iskušenju da učinite sljedeće:
zadane: & defaultno input_location: common_input output_location: dev_location mail: SENDER_NAME: pošiljatelj smtp_server: your_server login: your_login lozinka: top_secret razvoj: <<: * Defaultno mail: SENDER_NAME: sender_dev Proizvodnja: <<: * Defaultno output_location: prod_location mail: SENDER_NAME: sender_prod
Omogućava provjeriti
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
Ups, nešto je pošlo po zlu, problem kao što je spomenuto da je hash spajanje nije rekurzivna i dok spajanjem ga zamijeniti pošte u zadanom putem pošte proizvodnje koji ima samo jednu tipku. Rješenje / zaobišli je odvijati još jednu razinu:
common_settings: & common_settings input_location: common_input output_location: dev_location mail_defaults: & mail_defaults SENDER_NAME: pošiljatelj smtp_server: your_server login: your_login lozinka: top_secret zadane: & defaultno <<: * Common_settings mail: <<: * Mail_defaults razvoj: <<: * Defaultno Proizvodnja: <<: * Defaultno mail: <<: * Mail_defaults SENDER_NAME: sender_prod
Omogućuje ponovno provjeriti
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Jeste li reći da imate jedan više razine gniježđenja, i definitivno možete odmotati još jednu razinu, ali onda to postaje nered. Dakle, ako ne pokušavaju napisati rješenje kule Hanoi u conf datoteke, bolje je da restucture conf datoteke od kopanja u yaml ili nešto drugo. No, to je vaš poziv anyway.
Komentari
- dogging
- sřgemaskineoptimering
- Benjamin "balupton" Lupton



































