Združujejo v zgoščeni vsebini yaml datotek conf

31 julij 2009 z Prashant
Pila pod: tehnologija

YAML je zelo priročen za pisanje nastavitvene datoteke. Osnovna prednost je, da je se bere kot besedilno datoteko. Ta deluje zelo dobro, če je vaš config datoteka stanovanje (brez hierarhije) in nima ponovitev.
Če je vaš konfiguracije datoteka ponovitev potem je smiselno izločiti tiste elemente in jih ponovno. Kaj hočem reči je to - recimo, da ste napisali konfiguracijsko datoteko izgleda takole:

  razvoj:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: your_server
     Prijava: your_login
     geslo: top_secret
 produkcija:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: your_server
     Prijava: your_login
     geslo: top_secret 

Ob predpostavki, zgornjo kodo v / tmp / test.yml tukaj je, kako si lahko preberete v jezikih Python in Ruby
$cat readyml.py

 #! / Usr / bin / env python
 pprint od uvoza pprint kot ot
 # V Debian morali namestiti python-yaml
 od yaml uvoz obremenitve, load_all, smetišče
 hash = obremenitev (odprto ('/ tmp / test.yml'))
 odstotne točke (hash ["razvoj"]) 


$ cat readyml.rb

  #! / Usr / bin / env ruby
 zahtevajo želiš PP '
 hash = YAML :: obremenitev (File.open ('/ tmp / test.yml). branje)
 pp hash ['razvoj'] 

Tu je priročna podloga za različico 1 ruby
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' ali lahko poskusite enako v IRB ali python konzolo.

Upoštevajte, da v zgornji del kode, je vse drugo kot je izhodna lega enako na področju razvoja in proizvodnje delom. To je, če yml vozlišče identifikator gre za reševanje. Ideja je preprosta imajo vrsto privzete vrednosti in jih preglasijo na drugem mestu.
Lahko bi ga potegnite narazen, kot sledi:

  zamude: & Privzeta
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: pošiljatelj
     smtp_server: your_server
     Prijava: your_login
     geslo: top_secret
 razvoj:
   <<: * Podrobnosti privzeto
 produkcija:
   <<: * Podrobnosti privzeto
   output_location: prod_location 


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

Super, da deluje (tm)!.
Verjetno smo se z njimi trguje nekaj jasnost za malo čarovnijo. Tukaj je majhen razlaga: &, * in <<: in ki je sidro tag lahko razumemo kot vozlišča identifikator, * je vozlišče sklic in <<: pomeni razpršitve dokumentov.

Za več podrobnosti glej bodisi yaml očala ali Izbrani članek
Do sedaj tako dobro, vendar je ulov tukaj, ti zgostitvene združuje so brez rekurzije. Kaj to pomeni je to: recimo, da želite imeti drugačno ime pošiljatelja na pošti v dveh okoljih, vas bo morda zamikalo, da naredite naslednje:

  zamude: & Privzeta
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: pošiljatelj
     smtp_server: your_server
     Prijava: your_login
     geslo: top_secret
 razvoj:
   <<: * Podrobnosti privzeto
   mail:
     SENDER_NAME: sender_dev
 produkcija:
   <<: * Podrobnosti privzeto
   output_location: prod_location
   mail:
     SENDER_NAME: sender_prod 

Omogoča pregled

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

Ups, kaj je šlo narobe, problem, kot je navedeno zgoraj, je, da hash spajanje ni rekurzivna in hkrati združitev je zamenjala naslov neplačila po pošti proizvodnje, ki ima samo eno tipko. Rešitev / delo okoli je Dogaja še eno stopnjo:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  SENDER_NAME: pošiljatelj
   smtp_server: your_server
   Prijava: your_login
   geslo: top_secret

 zamude: & Privzeta
   <<: * Podrobnosti common_settings
   mail:
     <<: * Podrobnosti mail_defaults
 razvoj:
   <<: * Podrobnosti privzeto
 produkcija:
   <<: * Podrobnosti privzeto
   mail:
     <<: * Podrobnosti mail_defaults
     SENDER_NAME: sender_prod

Omogoča preverjanje še enkrat

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

Ali ste, da imate še eno raven gnezdenja, pa lahko zagotovo Dogaja še eno raven, potem pa postane nered. Torej, če se ne poskuša pisati rešitev stolpi Hanoju v conf datoteke, je bolje, da restucture conf datoteko kot kopanje v yaml ali kaj drugega. Ampak to je vaš klic vseeno.

Komentarji

  • Celotno 453-stranski dokument prav tako navaja možna področja za
    konsolidacije, vključno s privatizacijo smeti pickup, združevanje mesto in
    Wayne County zdravstvene službe in povezuje z javnih šolah Detroit na
    rekreacija. Predlog ne vključuje nobene ...

  • Oseba, ki pozna dogovora dejal obe strani še vedno so razpršitev iz imena za združeno podjetje. Toda ta oseba, ki je dejal ideja šteje je izbor imena, ki nima besedo "Deutsche" ali kratico "NYSE" v njem. ...

  • Ja siten ne združita rekurzivno. Sem lahko, da bi nastalo v moji balphp knjižnici.

blog pripombe, ki jih napaja Disqus