Sammanfoga hashes i yaml conf-filer

31 Juli 2009 med Prashant
Filed under: teknik

Yaml är ganska praktiskt för att skriva konfigurationsfiler. Primär fördel är att, läser det som textfil. Detta fungerar riktigt bra om din konfigurationsfil är platt (ingen hierarki) och har inga repetitioner.
Om konfigurationer filen har repetitioner då är det logiskt att skilja ut dessa element och återanvända dem. Vad jag menar är - låt oss säga att du din konfigurationsfil ser ut så här:

  utveckling:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: Your_Server
     login: your_login
     Lösenord: top_secret
 produktion:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: Your_Server
     login: your_login
     Lösenord: top_secret 

Förutsatt ovanstående kod i / tmp / test.yml här är hur du kan läsa i Python och Ruby
$cat readyml.py

 #! / Usr / bin / env python
 från pprint import pprint som pp
 # I debian behöver du installera python-yaml
 från yaml import belastning, load_all, dumpa
 hash = last (open ("/ tmp / test.yml '))
 PP (hash ["utveckling"]) 


$ cat readyml.rb

  #! / Usr / bin / env ruby
 kräver "PP"
 hash = yaml :: last (File.open ('/ tmp / test.yml). läsa)
 PP hash ["utveckling"] 

här är en praktisk en liner för Ruby version
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' eller så kan du prova samma sak i IRB eller python konsol.

Notera att i ovanstående kodsträngen är allt annat än produktionen placering är densamma i utveckling och produktion del. Det är där yml nodidentifieraren kommer att rädda. Idén är enkel har en uppsättning standardvärden och åsidosätter dem på annan plats.
Du kan dra isär enligt följande:

  defaults: & standard
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: avsändare
     smtp_server: Your_Server
     login: your_login
     Lösenord: top_secret
 utveckling:
   <<: * Standard
 produktion:
   <<: * Standard
   output_location: prod_location 


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

Bra, det fungerar (tm)!.
Förmodligen har vi handlas viss klarhet för lite magi. Här är ett litet förklaring: &, * och <<: & som är ankartaggen kan förstås som nod identifierare, är * nod referens och <<: står för hash kopplingen.

För mer information se antingen yaml specifikationer eller wikipedia
Så långt så bra men det finns en hake här, dessa hash smälter samman är inte rekursiva. Vad det betyder är detta: låt oss säga att du vill ha olika namn för avsändare post i två miljöer kan du frestas att göra följande:

  defaults: & standard
   input_location: common_input
   output_location: dev_location
   mail:
     SENDER_NAME: avsändare
     smtp_server: Your_Server
     login: your_login
     Lösenord: top_secret
 utveckling:
   <<: * Standard
   mail:
     SENDER_NAME: sender_dev
 produktion:
   <<: * Standard
   output_location: prod_location
   mail:
     SENDER_NAME: sender_prod 

Lets kontrollera

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

Oj, något gick fel, problem som nämnts ovan är att hash sammanslagning inte är rekursiv och medan slå ihop den utbytt post om standard per post av produktionen som har endast en nyckel. Lösning / arbete runt är att rulla ut en mer jämn:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  SENDER_NAME: avsändare
   smtp_server: Your_Server
   login: your_login
   Lösenord: top_secret

 defaults: & standard
   <<: * Common_settings
   mail:
     <<: * Mail_defaults
 utveckling:
   <<: * Standard
 produktion:
   <<: * Standard
   mail:
     <<: * Mail_defaults
     SENDER_NAME: sender_prod

Lets kontrollera igen

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

Sa du att du har en större grad av häckande, och du kan definitivt rulla ytterligare en nivå, men sedan blir det en enda röra. Så, om du inte försöker skriva lösning torn Hanoi i en conf-fil, är det bättre att restucture conf fil än att gräva i yaml eller något annat. Men det är ditt samtal ändå.

Kommentarer

  • Den fullständiga 453-sidigt dokument listar också potentiella områden för
    konsolidering, bland annat privatisering av sopor pickup, en sammanslagning av staden och
    Wayne County hälsodepartement och partnerskap med Detroit Public Schools på
    rekreation. Förslaget omfattade inte något ...

  • En person som känner till affären sa de två sidorna fortfarande hashing ut ett namn för en sammanslagna bolaget. Men den här personen sa en idé som diskuteras är valet av ett namn som inte har ordet "Deutsche" eller förkortningen "NYSE" i den. ...

  • Ja irriterande det inte ihop rekursivt. Jag kunde göra en lösning i min balphp bibliotek.

blogg kommentarer drivs av Disqus