Yhdistäminen tiivisteiden sisään yaml conf tiedostot
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.



































