Yhdistäminen tiivisteiden sisään yaml conf tiedostot

31 heinäkuu 2009 by Prashant · Comments
Filed under: tekniikka

YAML on varsin kätevä kirjoittaa asetustiedostoja. Ensisijainen etu on, että se lukee kuin tekstitiedosto. Tämä toimii todella hyvin, jos config tiedosto on tasainen (ei hierarkia) eikä toistoja.
Jos kokoonpanoissa tiedosto on toistoja sitten on järkevää erottaa nämä seikat ja käyttää niitä uudelleen. Mitä tarkoitan on tässä - sanokaamme sinulle config tiedosto näyttää tältä:

  kehitys:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: oma_palvelimesi
     kirjautuminen: your_login
     Salasana: top_secret
 tuotantoon:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: oma_palvelimesi
     kirjautuminen: your_login
     Salasana: top_secret 

Olettaen edellä koodi in / tmp / test.yml tässä on, kuinka voit lukea Python ja Ruby
$cat readyml.py

 #! / Usr / bin / env python
 alkaen pprint tuonti pprint kuin PP
 # Debianin tarvitse asentaa python-yaml
 alkaen yaml tuonti kuorma, load_all, dump
 hash = kuormitus (open ("/ tmp / test.yml '))
 PP (hash ['kehitys']) 


$ cat readyml.rb

  #! / Usr / bin / env ruby
 vaativat "pp"
 hash = YAML:: kuormitus (File.open ('/ tmp / test.yml "). lukenut)
 PP hash ["kehitystä"] 

tässä on kätevä yhdelle putkelle Ruby versio
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' tai voit kokeilla sama IRB tai python-konsoli.

Huomaa, että edellä koodinpätkä, kaikki on muu kuin lähtö sijainti on sama kehityksen ja tuotannon osa. Tässä kohtaa yml solmu tunniste tulee pelastus. Idea on yksinkertainen on joukko oletusarvot ja ohittaa ne eri paikkaan.
Voisit vetää se irti seuraavasti:

  defaults: & defaults
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: lähettäjä
     smtp_server: oma_palvelimesi
     kirjautuminen: your_login
     Salasana: top_secret
 kehitys:
   <<: * Defaults
 tuotantoon:
   <<: * Defaults
   output_location: prod_location 


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

Hienoa, se toimii (tm)!.
Todennäköisesti me vaihdettiin joitakin selvyyttä vähän taikuutta. Tässä on pieni selitys: &, * ja <<: & mikä on ankkuri tag voidaan ymmärtää solmu tunniste, * on solmu viittaus ja <<: sanoista hash yhdistää.

Lisätietoja löytyy joko yaml silmälasit tai Wikipedia
Hyvä niin, mutta on kiinni täällä, nämä hash sulautuu ei rekursiivinen. Mitä se tarkoittaa tätä: Oletetaan, että haluat olla eri lähettäjän nimi postia kahdessa ympäristössä, saatat olla houkutus tehdä seuraavaa:

  defaults: & defaults
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: lähettäjä
     smtp_server: oma_palvelimesi
     kirjautuminen: your_login
     Salasana: top_secret
 kehitys:
   <<: * Defaults
   mail:
     SENDER_NAME: sender_dev
 tuotantoon:
   <<: * Defaults
   output_location: prod_location
   mail:
     SENDER_NAME: sender_prod 

Lets tarkistaa

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

Oho, jokin meni pieleen, ongelma kuten edellä on mainittu, että hash yhdistää ei rekursiivinen ja vaikka sulauttamalla se korvattiin mail laiminlyö postitse tuotantopaikalla, joka on vain yksi avain. Ratkaisu / kiertää on kääriä rullalle yksi taso:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  SENDER_NAME: lähettäjä
   smtp_server: oma_palvelimesi
   kirjautuminen: your_login
   Salasana: top_secret

 defaults: & defaults
   <<: * Common_settings
   mail:
     <<: * Mail_defaults
 kehitys:
   <<: * Defaults
 tuotantoon:
   <<: * Defaults
   mail:
     <<: * Mail_defaults
     SENDER_NAME: sender_prod

Lets tarkistaa uudelleen

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

Sanoitko sinulla on vielä yksi taso pesiä, ja voit varmasti aueta yksi taso, mutta sitten siitä tulee sotkua. Joten, jos et ole yrittänyt kirjoittaa ratkaisu Hanoin tornit in conf tiedostoa, se on parempi restucture conf tiedostoon kuin kaivaa yaml tai jotain muuta. Mutta se on teidän soittaa muutenkin.