Yhdistäminen tiivisteiden ja yaml conf tiedostojen

31 heinäkuu 2009 by Prashant
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 toistoa on järkevää erottaa näitä tekijöitä ja käyttää niitä uudelleen. Tarkoitan siis tämän - sanokaamme sinulle config tiedosto näyttää tältä:

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

Olettaen yli koodi in / tmp / test.yml tässä miten voit lukea Python ja Ruby
$cat readyml.py

 #! / Usr / bin / env python
 mistä pprint tuonti pprint kuin yks
 # Debianin pitää asentaa python-yaml
 mistä yaml tuonti kuormitus 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 "). luettu)
 pp hash ["kehitys"] 

Tässä on kätevä yhdelle putkelle Ruby version
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' tai voit kokeilla samaa sisäisten luottoluokitusten menetelmän tai python konsolin.

Huomaa, että edellä koodinpätkä, kaikki on muu kuin lähtö paikka on sama kehityksen ja tuotannon osa. Täällä yml solmu tunniste tulee pelastamaan. Idea on yksinkertainen on joukko oletusarvot ja ohittaa ne eri paikkaan.
Voisit vetää sen lisäksi seuraavasti:

  defaults: & oletusarvot
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: lähettäjä
     smtp_server: oma_palvelimesi
     login: your_login
     Salasana: top_secret
 kehitys:
   <<: * Oletusarvot
 tuotantoon:
   <<: * Oletusarvot
   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ä pieni selitys: &, * ja <<: ja joka on ankkuri tag voidaan ymmärtää solmun tunniste, * on solmu viite ja <<: tarkoittaa hash yhdistämisessä.

Lisätietoja löytyy joko yaml silmälasit tai wikipedia
Hyvä niin, mutta siellä on saalis täällä, nämä hash yhdistämisiä ei ole rekursiivinen. Mitä se tarkoittaa on tämä: Oletetaan, että haluat olla erilaisia ​​lähettäjän nimen postin kahdessa ympäristössä, saatat joutua kiusaukseen tehdä seuraavaa:

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

Katsotaan

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

Oho, jokin meni pieleen, ongelma kuin edellä on mainittu, että hash yhdistäminen ei ole rekursiivinen, ja kun yhdistetään se korvattiin mail laiminlyö postia tuotantoa, joka on vain yksi avain. Ratkaisu / työ ympärillä 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
   login: your_login
   Salasana: top_secret

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

Katsotaan uudestaan

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

Sanoitko sinulla on yksi sisältymistaso, hyvin voit varmasti levittää yksi taso, mutta silloin siitä tulee sotkua. Joten, jos et yritä kirjoittaa ratkaisua Hanoin tornit on conf tiedostoon, on parempi restucture conf tiedostoon kuin kaivaa yaml tai jotain muuta. Mutta se on teidän puhelu muutenkin.

Comments

  • Koko 453-sivuinen dokumentti esitetään myös mahdollisia kohteita
    konsolidointi, joihin olisi roska pickup, yhdistämällä kaupunki ja
    Wayne County terveydenhuollon yksiköt ja kumppaneina Detroit Public Koulut
    virkistäytymiseen. Ehdotuksessa ei ole mitään ...

  • Henkilö tuntee paljon sanoi molemmat osapuolet ovat edelleen tiivistettä ulos nimi sulautuneelle yritykselle. Mutta tämä henkilö sanoi idea pidetään on nimen valinta, joka ei ole sanaa "Deutsche" tai lyhenne "NYSE" siinä. ...

  • Joo harmittaa se ei sulaudu rekursiivisesti. Pystyin tekemään kiertää minun balphp kirjastossa.

blogin kommentit powered by Disqus