Сливане на хешове в YAML файлове Conf

31ви юли 2009 от Prashant
Намира в: технологии

YAML е доста по-удобен за писане на конфигурационни файлове. Начална предимство е, че се чете като текстов файл. Това работи много добре, ако си конфигурационния файл е плосък (няма йерархия) и няма повторения.
Ако конфигурации файл повторения тогава има смисъл да се разделят на тези елементи и ги използва повторно. Какво искам да кажа е това - Да речем, че си конфигурационния файл изглежда така:

  развитие:
   input_location: common_input
   output_location: dev_location
   мейл:
     smtp_server: your_server
     Вход: your_login
     парола: top_secret
 производство:
   input_location: common_input
   output_location: dev_location
   мейл:
     smtp_server: your_server
     Вход: your_login
     парола: top_secret 

Ако се приеме по-горе код в малки / test.yml Ето как можете да прочетете в Python и рубин
$cat readyml.py

 #! / ЮЕсАр / хамбар / "Околна среда" питон
 от pprint pprint внос, п
 # В Debian трябва да инсталирате Python-YAML
 от YAML внос натоварване, load_all, дъмп
 хашиш = натоварване (открито ("малки / test.yml"))
 п.п. (хеш развитие [']) 


$ cat readyml.rb

  #! / ЮЕсАр / хамбар / "Околна среда" рубин
 изисква "п"
 хашиш = YAML:: натоварване (File.open ("малки / test.yml"). прочети)
 [П хеш "разработване"] 

тук е удобен една подложка за транслитерацията версия
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' или можете да опитате същото в IRB или питон конзола.

Имайте предвид, че в горния фрагмент код, всичко е различно от продукцията Мястото е същото в развитието и производството част. Това е мястото, където yml възел идентификатор идва да спаси. Идеята е проста разполага с набор от стойности по подразбиране и да ги замени в друго населено място.
Можете да го разкъсвам на парчета, както следва:

  подразбиране: & подразбиране
   input_location: common_input
   output_location: dev_location
   мейл:
     sender_name: подателя
     smtp_server: your_server
     Вход: your_login
     парола: top_secret
 развитие:
   <<: * По подразбиране
 производство:
   <<: * По подразбиране
   output_location: prod_location 


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

Велики, тя работи (TM)!.
Може да се каже ние търгуват някои яснота за малко на магия. Тук е малко обяснение: &, * и <<: & която е котва маркер може да се разбира като възел идентификатор * е възел референтната и <<: щандове за хеш документи.

За повече подробности вижте или YAML очила или Уикипедия
Дотук добре, но има улов тук, тези хашиш слива не са рекурсивни. Какво означава това е: Да речем, че искат да имат друго име за подател поща в две среди, може да се изкуши да направите следното:

  подразбиране: & подразбиране
   input_location: common_input
   output_location: dev_location
   мейл:
     sender_name: подателя
     smtp_server: your_server
     Вход: your_login
     парола: top_secret
 развитие:
   <<: * По подразбиране
   мейл:
     sender_name: sender_dev
 производство:
   <<: * По подразбиране
   output_location: prod_location
   мейл:
     sender_name: sender_prod 

Да проверите

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

Опа, нещо се обърка, проблем, тъй като споменатите по-горе е, че хеш сливат не е циклично и докато сливащите се заменя поща за неизпълнение на задълженията по пощата на производство, което има само един ключ. Разтвор / заобиколите е да се развивам още едно ниво:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  sender_name: подателя
   smtp_server: your_server
   Вход: your_login
   парола: top_secret

 подразбиране: & подразбиране
   <<: * Common_settings
   мейл:
     <<: * Mail_defaults
 развитие:
   <<: * По подразбиране
 производство:
   <<: * По подразбиране
   мейл:
     <<: * Mail_defaults
     sender_name: sender_prod

Да проверите отново

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

Каза ли ти още една степен на гнездене, и ти определено може да развивам една по-голяма степен, но след това тя се превръща в хаос. Така че, ако не се опитвате да напишете решение на кулите на Ханой в конф файл, той е по-добре да restucture Conf файл от изкопни работи в YAML или нещо друго. Но това е вашето обаждане или иначе.

Коментари

    Блог коментари захранва от Disqus