Apvienojas hashes in YAML CONF failiem
YAML ir diezgan parocīgs rakstīšanai konfigurācijas failus. Galvenā priekšrocība ir tā, ka tā skan kā teksta failu. Tas darbojas patiešām labi, ja jūsu config fails ir plakana (bez hierarhija) un nav atkārtojumu.
Ja jūsu konfigurācijas fails ir atkārtojumi, tad ir jēga nodalīt šos elementus un tos atkārtoti izmantot. Ko es domāju tas ir - pieņemsim, ka tu savu config fails izskatās šādi:
attīstība: input_location: common_input output_location: dev_location pasts: smtp_server: your_server Vārds: your_login parole: top_secret ražošana: input_location: common_input output_location: dev_location pasts: smtp_server: your_server Vārds: your_login parole: top_secret
Pieņemot iepriekš koda / tmp / test.yml šeit ir, kā jūs varat lasīt ar python un Ruby
$cat readyml.py
# / Usr! / Bin / env python no pprint importa pprint, PP # In Debian jāinstalē python-YAML no YAML importa slodzes, load_all, pašizgāzēji hash = slodze (atklātā ('/ tmp / test.yml ")) pp (hash ['attīstība'])
$ cat readyml.rb
# / Usr! / Bin / env rubīns pieprasa "PP" hash = YAML :: slodze (File.open ('/ tmp / test.yml "). lasīt) pp hash ['attīstība']
Šeit ir parocīgs 1 ieliktnis uz rubīna versiju
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' , vai jūs varat mēģināt pats IRB vai python konsoles.
Atzīmē, ka iepriekš koda fragmentu, viss ir izņemot izejas vieta ir vienāds attīstības un ražošanas daļas. Tas ir, ja YML mezglu identifikators nāk glābšana. Ideja ir vienkārša ir kopums, noklusējuma vērtības un ignorēt tos citā vietā.
Jūs varētu pull to nošķir šādi:
noklusējumu: & noklusējumus input_location: common_input output_location: dev_location pasts: SENDER_NAME: Sūtītājs smtp_server: your_server Vārds: your_login parole: top_secret attīstība: <<: * Noklusējumus ražošana: <<: * Noklusējumus output_location: prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Liels, tas darbojas (tm)!.
Varbūt mēs tirgo zināmu skaidrību par mazliet maģijas. Šeit ir neliels paskaidrojums: &, * un <<: & kas ir enkurs tag var saprast kā mezglu identifikatoru, * nav mezgla atsauces un <<: kājiņām hash sapludināšanā.
Sīkāku informāciju skatīt nu YAML specs vai enciklopēdijas
Līdz šim tik labi, bet tur ir nozvejas šeit, šie hash apvienojas nav rekursīvs. Ko tas nozīmē ir tā: pieņemsim, ka jūs vēlaties būt atšķirīgs sūtītāja vārdu pastam divās vidēs, jums var rasties kārdinājums veikt šādas:
noklusējumu: & noklusējumus input_location: common_input output_location: dev_location pasts: SENDER_NAME: Sūtītājs smtp_server: your_server Vārds: your_login parole: top_secret attīstība: <<: * Noklusējumus pasts: SENDER_NAME: sender_dev ražošana: <<: * Noklusējumus output_location: prod_location pasts: SENDER_NAME: sender_prod
Lets pārbaudīt
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
Hmm, kaut kas nogāja greizi, problēma kā minēts iepriekš, ir, ka hash sapludināšana nav rekursīvs un vienlaikus apvienojot to nomainīt pasta vēstuli nepilda pastu produkciju, kas ir tikai vienu taustiņu. Risinājums / darba apkārt ir atritināt vēl vienu līmeni:
common_settings: & common_settings input_location: common_input output_location: dev_location mail_defaults: & mail_defaults SENDER_NAME: Sūtītājs smtp_server: your_server Vārds: your_login parole: top_secret noklusējumu: & noklusējumus <<: * Common_settings pasts: <<: * Mail_defaults attīstība: <<: * Noklusējumus ražošana: <<: * Noklusējumus pasts: <<: * Mail_defaults SENDER_NAME: sender_prod
Lets pārbaudīt vēlreiz
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Tu teikt, jums ir vēl vienu pakāpi ligzdošanas, labi jūs varat noteikti atritināt vēl vienu pakāpi, bet tad tas kļūst par putru. Tātad, ja jūs neesat mēģināt rakstīt risinājumu torņu Hanojā ar conf failu, tas ir labāk restucture conf failu, nekā rakšana vērā YAML vai kaut kas cits. Bet tas ir jūsu zvanu jebkurā gadījumā.
Komentāri
- dogging
- søgemaskineoptimering
- Benjamin "balupton" Lupton



































