Apvienojas hashes in YAML CONF failiem

31 jūlijs 2009 ar Prashant
Iesniegts saskaņā ar: tehnoloģija

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

  • Pilns 453 lappušu dokuments ir uzskaitīti arī potenciālās jomas
    konsolidācija, ieskaitot privatizāciju trash pikaps, apvienojot pilsētu un
    Wayne County veselības departamenti un partnerattiecības ar Detroitas publisko skolu par
    atpūta. Priekšlikumā nav iekļauta neviena ...

  • Persona iepazinušies ar darījumu sacīja abas puses joprojām tiek sajaukšanai ārā nosaukumu apvienotā uzņēmuma. Bet šis cilvēks teica ideja tiek apsvērta, ir izvēle nosaukumam, kuram nav vārdu "Deutsche" vai saīsinājumu "NYSE" tajā. ...

  • Yeah kaitinošas tas nav sapludināšanas rekursīvi. Man bija iespēja veikt PROFILAKSE manā balphp bibliotēkā.

blog komentārus powered by Disqus