Обједињавање Хешеви у иамл конф фајлова

Јул 31, 2009 Прасхант
Филед ундер: технологији

ИАМЛ је прилично згодан за писање конфигурационе фајлове. Основна предност је у томе, то се чита као текстуалну датотеку. Ово ради заиста добро ако ваш конфиг фајл је равна (без хијерархија) и нема понављања.
Ако ваша датотека конфигурације има понављања онда има смисла да се одвоје од те елементе и поново их. Оно што ја мислим је ово - рецимо да ваша датотека конфигурација изгледа овако:

  Развој:
   инпут_лоцатион: цоммон_инпут
   оутпут_лоцатион: дев_лоцатион
   Емаил:
     смтп_сервер: иоур_сервер
     Логин: иоур_логин
     лозинка: топ_сецрет
 производња:
   инпут_лоцатион: цоммон_инпут
   оутпут_лоцатион: дев_лоцатион
   Емаил:
     смтп_сервер: иоур_сервер
     Логин: иоур_логин
     лозинка: топ_сецрет 

Под претпоставком изнад кода у / тмп / тест.имл Ево како можете да прочитате у Питхон и Руби
$cat readyml.py

 # / Уср /! Бин / енв питхон
 ппринт из увоза ппринт као пп
 # У Дебиану потребно је да инсталирате Питхон-иамл
 иамл из увоза оптерећења, лоад_алл, депонија
 хасх = оптерећење (отварају ('/ тмп / тест.имл'))
 ПП (хасх ['развој']) 


$ cat readyml.rb

  # / Уср /! Бин / енв рубин
 захтевају наслова ПП наслова
 хасх = ИАМЛ :: оптерећење (Филе.опен ('/ тмп / тест.имл'). реад)
 ПП Хасх ['развој'] 

Овде је згодно за један путнички авион рубина верзији
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' , или можете покушати да исти у ИРБ или Питон конзолу.

Имајте на уму да у горе наведеном фрагмент кода, све је друго него излаз локација је иста у развој и производњу дела. Ово је место где имл чвор идентификатор долази да спасе. Идеја је једноставна имају скуп подразумеваних вредности и заменити их на другом месту.
Можете да га растргнути као што следи:

  а: дефаултс и подразумеване
   инпут_лоцатион: цоммон_инпут
   оутпут_лоцатион: дев_лоцатион
   Емаил:
     СЕНДЕР_НАМЕ: пошиљалац
     смтп_сервер: иоур_сервер
     Логин: иоур_логин
     лозинка: топ_сецрет
 Развој:
   <<: Дефаултс РСД *
 производња:
   <<: Дефаултс РСД *
   оутпут_лоцатион: прод_лоцатион 


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

Одлично, то ради (тм).
Убедљиво смо тргује неке јасноћу на мало магије. Овде је мало објашњење: &, * и <<: и што је сидро Таг се може схватити као чвора идентификатора, је * и референтни чвор <<: скраћеница за хеш стапања.

За више детаља погледајте било иамл спецификације или Википедиа
До сада је тако добро, али овде постоји цака, ови хасх стапања нису рекурзивно. Шта то значи је ово: рецимо да желите да имате другачије име пошиљаоца за пошту у два окружења, можда ћете бити у искушењу да урадите следеће:

  а: дефаултс и подразумеване
   инпут_лоцатион: цоммон_инпут
   оутпут_лоцатион: дев_лоцатион
   Емаил:
     СЕНДЕР_НАМЕ: пошиљалац
     смтп_сервер: иоур_сервер
     Логин: иоур_логин
     лозинка: топ_сецрет
 Развој:
   <<: Дефаултс РСД *
   Емаил:
     СЕНДЕР_НАМЕ: сендер_дев
 производња:
   <<: Дефаултс РСД *
   оутпут_лоцатион: прод_лоцатион
   Емаил:
     СЕНДЕР_НАМЕ: сендер_прод 

Омогућава проверити

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

Упс, нешто је пошло наопако, проблем као горе поменуто је да је хеш стапање није рекурзивна и док стапање је заменио маил подразумевано поштом производње који има само један тастер. Решење / решили да се одвијати још један ниво:

  цоммон_сеттингс: & цоммон_сеттингс
 инпут_лоцатион: цоммон_инпут
 оутпут_лоцатион: дев_лоцатион
 маил_дефаултс линкови: & маил_дефаултс
  СЕНДЕР_НАМЕ: пошиљалац
   смтп_сервер: иоур_сервер
   Логин: иоур_логин
   лозинка: топ_сецрет

 а: дефаултс и подразумеване
   <<: Цоммон_сеттингс РСД *
   Емаил:
     <<: Маил_дефаултс РСД *
 Развој:
   <<: Дефаултс РСД *
 производња:
   <<: Дефаултс РСД *
   Емаил:
     <<: Маил_дефаултс РСД *
     СЕНДЕР_НАМЕ: сендер_прод

Летс проверите поново

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

Да ли ви кажете да имате један више ниво гнезде, добро се дефинитивно може одвијати још један ниво, али онда то постаје хаос. Дакле, ако не покушавате да напише решење за куле Ханоја у конф фајл, боље је да рестуцтуре цонф фајл од копања у иамл или нешто друго. Али то је ионако ваш позив.

Коментари

  • Пун 453-страна документу се такође наводи потенцијалне области за
    консолидација, укључујући приватизацију треш камионет, спајањем и град
    Ваине Цоунти здравствених одељења и партнерство са Детроит јавним школама на
    рекреацију. Предлог не садржи било који ...

  • Упознат са посла рекао да су две стране још увек уситњавања се име за обједињеном компаније. Али ова особа је идеја које се разматрају јесте избор имена која нема реч "Дојче" или акроним "НИСЕ" у њему. ...

  • Да нервира не рекурзивно обједињавање. Био сам у стању да направи решење у мом балпхп библиотеци.

блог коментари поверед би Дискус