Sammanfoga hashes i yaml conf-filer
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
- dogging
- søgemaskineoptimering
- Benjamin "balupton" Lupton



































