Spajanje hashes u yaml boys = dječaci datoteka

31. srpanj 2009 by prashant
Varalica pod: tehnologija

YAML je vrlo zgodan za pisanje konfiguracijske datoteke. Osnovna prednost je da se čita kao tekstualnu datoteku. To radi jako dobro ako je vaša config file je flat (nema hijerarhije) i nema ponavljanja.
Ako je Vaš konfiguracije datoteka ima ponavljanja onda ima smisla izdvojiti one elemente te ih ponovno. Što mislim je to - recimo da vaša config file izgleda ovako:

  razvoj:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: your_server
     login: your_login
     lozinka: top_secret
 Proizvodnja:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: your_server
     login: your_login
     lozinka: top_secret 

Uz pretpostavku iznad koda u / tmp / test.yml ovdje je kako možete pročitati u Pythonu i Ruby
$cat readyml.py

 #! / Usr / bin / env python
 pprint iz uvoza pprint kao pp
 # U Debian morati instalirati python-yaml
 yaml iz uvoza tereta, load_all, izvatkom
 hash = load (open ("/ tmp / test.yml '))
 pp (hash ['razvoj']) 


$ cat readyml.rb

  #! / Usr / bin / env rubin
 zahtijevaju možeš PP kontakta
 hash = YAML :: load (File.open ("/ tmp / test.yml '). pročitati)
 pp hash ['razvoj'] 

ovdje je pri ruci jedan brod za rubin verziji
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' ili možete isprobati isti u IRB ili python konzola.

Imajte na umu da u gore isječak koda, sve je osim izlaza lokacija je ista u razvoju i proizvodnji dio. Ovo je mjesto gdje yml čvora identifikator dolazi spasiti. Ideja je jednostavna imati set zadanih vrijednosti te ih nadjačati, na drugom mjestu.
Možete ga razvlači kako slijedi:

  zadane: & defaultno
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: pošiljatelj
     smtp_server: your_server
     login: your_login
     lozinka: top_secret
 razvoj:
   <<: * Defaultno
 Proizvodnja:
   <<: * Defaultno
   output_location: prod_location 


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

Super, to radi (tm)!.
Uvjerljivo smo trgovali neke jasnoću za malo magije. Ovdje je malo objašnjenje: i, * i <<: i što je sidro tag se može shvatiti kao čvora identifikator, * je čvor referentni i <<: kratica za hash spajanja.

Za više pojedinosti vidi bilo yaml naočale ili Wikipedia
Do sada je tako dobro, ali postoji kvaka ovdje, ove hash stapa nisu rekurzivni. Što to znači da je ovo: recimo da želite imati drugačiji naziv pošiljatelja pošte u dva okruženja, vi svibanj biti u iskušenju da učinite sljedeće:

  zadane: & defaultno
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: pošiljatelj
     smtp_server: your_server
     login: your_login
     lozinka: top_secret
 razvoj:
   <<: * Defaultno
   mail:
     SENDER_NAME: sender_dev
 Proizvodnja:
   <<: * Defaultno
   output_location: prod_location
   mail:
     SENDER_NAME: sender_prod 

Omogućava provjeriti

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

Ups, nešto je pošlo po zlu, problem kao što je spomenuto da je hash spajanje nije rekurzivna i dok spajanjem ga zamijeniti pošte u zadanom putem pošte proizvodnje koji ima samo jednu tipku. Rješenje / zaobišli je odvijati još jednu razinu:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  SENDER_NAME: pošiljatelj
   smtp_server: your_server
   login: your_login
   lozinka: top_secret

 zadane: & defaultno
   <<: * Common_settings
   mail:
     <<: * Mail_defaults
 razvoj:
   <<: * Defaultno
 Proizvodnja:
   <<: * Defaultno
   mail:
     <<: * Mail_defaults
     SENDER_NAME: sender_prod

Omogućuje ponovno provjeriti

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

Jeste li reći da imate jedan više razine gniježđenja, i definitivno možete odmotati još jednu razinu, ali onda to postaje nered. Dakle, ako ne pokušavaju napisati rješenje kule Hanoi u conf datoteke, bolje je da restucture conf datoteke od kopanja u yaml ili nešto drugo. No, to je vaš poziv anyway.

Komentari

  • Puna 453 stranica dokument također navodi potencijalna područja za
    konsolidacija, uključujući i privatizacije trash kurva, spajanjem grada i
    Wayne County ministarstva zdravstva i partnerstva s Detroit državnim školama na
    rekreaciju. Prijedlog ne uključuje bilo ...

  • Osoba upoznat s posla rekao je da su dvije strane još uvijek raspršeno se naziv spojenog poduzeća. No, ta osoba je ideja koja se smatra da je izbor imena koja nema riječi "Deutsche" ili akronim "NYSE" u njemu. ...

  • Da neugodno ne spojiti rekurzivno. Sam bio u mogućnosti napraviti zaobilazno rješenje u mom balphp knjižnici.

Blog Komentari powered by Disqus