Yhdistäminen tiivisteiden ja yaml conf tiedostojen
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
- dogging
- søgemaskineoptimering
- Benjamin "balupton" Lupton



































