Sisteminį maišos yaml conf failus

Liepos 31, 2009 prashant · Komentarai
Filed under: technologijos

Yaml yra gana patogu rašyti konfigūracijos failus. Pagrindinis privalumas yra tai, kad ji skamba kaip tekstinį failą. Tai veikia tikrai gerai, jei jūsų konfigūracijos failas yra plokščia (ne hierarchija) ir neturi pakartojimų.
Jei Jūsų konfigūracijos failas yra pakartojimų tada prasminga išskirti šiuos elementus ir pakartotinai juos. Ką reiškia tai, tarkime, jūsų konfigūracijos failas atrodo taip:

  plėtra:
   input_location: common_input
   output_location: dev_location
   paštas:
     smtp_server: your_server
     Vartotojas: your_login
     slaptažodis: top_secret
 gamyba:
   input_location: common_input
   output_location: dev_location
   paštas:
     smtp_server: your_server
     Vartotojas: your_login
     slaptažodis: top_secret 

Darant prielaidą, kad virš kodą į / tmp / test.yml čia, kaip jūs galite skaityti python ir Ruby
$cat readyml.py

 #! / Usr / bin / env python
 , iš pprint importo pprint kaip pp
 # Debian reikia instaliuoti python-yaml
 yaml importo apkrovos, load_all, sąvartynas
 hash = apkrova (atvira ('/ tmp / test.yml "))
 PP (maišos ["tobulinimas ']) 


$ cat readyml.rb

  #! / Usr / bin / env ruby
 reikalauti "pp '
 hash = yaml :: apkrova (File.open ('/ tmp / test.yml ") ... skaityti)
 PP maišos ['vystymasis'] 

čia yra patogus įdėklas ruby ​​versija
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' arba galite pabandyti pats IRB ar python konsolės.

Atkreipkite dėmesį, kad pirmiau kodo fragmentą, viskas išskyrus išėjimo vieta yra pati kūrimo ir gamybos daliai. Tai, kur yml mazgas identifikatorius ateina gelbėti. Idėja yra labai paprasta, numatytųjų reikšmių rinkinį ir perrašyti jas kitoje vietoje.
Jūs galite ištraukti jį išskiria taip:

  defaults: ir pagal nutylėjimą
   input_location: common_input
   output_location: dev_location
   paštas:
     Sender_name: siuntėjas
     smtp_server: your_server
     Vartotojas: your_login
     slaptažodis: top_secret
 plėtra:
   <<: * Pagal nutylėjimą
 gamyba:
   <<: * Pagal nutylėjimą
   output_location: prod_location 


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

Puiku, ji veikia (tm)!.
Be abejonės mes prekiaujama šiek tiek aiškumo šiek tiek magijos. Čia yra nedidelis paaiškinimas: &, * ir <<: ir kuris yra žymės saito gali būti suprantama kaip mazgo identifikatoriaus * mazgas nuoroda ir <<: reiškia maišos suliejimą.

Dėl išsamesnės informacijos žr. Arba yaml specifikacijų arba Wikipedia
Iki šiol tokia gera, bet čia yra laimikis, šios maišos susilieja nėra rekursinis. Ką tai reiškia yra tokia: tarkime, norite turėti skirtingą dviejų aplinkų paštu siuntėjo vardą, jums gali būti linkusios daryti taip:

  defaults: ir pagal nutylėjimą
   input_location: common_input
   output_location: dev_location
   paštas:
     Sender_name: siuntėjas
     smtp_server: your_server
     Vartotojas: your_login
     slaptažodis: top_secret
 plėtra:
   <<: * Pagal nutylėjimą
   paštas:
     Sender_name: sender_dev
 gamyba:
   <<: * Pagal nutylėjimą
   output_location: prod_location
   paštas:
     Sender_name: sender_prod 

Leidžia patikrinti,

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

Oi, kažkas nutiko, kaip minėta problema yra ta, kad maišos suliejimas nėra rekursinis o sujungus jis pakeitė laišką įsipareigojimų nevykdymo paštu produkcija, kuri turi tik vieną klavišą. Sprendimas / darbas aplink išsivynioti daugiau vieną lygį:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: ir mail_defaults
  Sender_name: siuntėjas
   smtp_server: your_server
   Vartotojas: your_login
   slaptažodis: top_secret

 defaults: ir pagal nutylėjimą
   <<: * Common_settings
   paštas:
     <<: * Mail_defaults
 plėtra:
   <<: * Pagal nutylėjimą
 gamyba:
   <<: * Pagal nutylėjimą
   paštas:
     <<: * Mail_defaults
     Sender_name: sender_prod

Leidžia patikrinti dar kartą

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

Ar jūs kalbate, jūs turite dar vieną lygį, lizdus, ​​gerai jūs tikrai gali išsivynioti dar vieną lygį, bet tada ji tampa netvarka. Taigi, jei esate ne bando parašyti sprendimą bokštus Hanojus conf faile, geriau, į restucture conf failą ne kasti į yaml ar kažkas kita. Bet tai jūsų skambutis vistiek.