Сливане на хешове в YAML файлове Conf
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 или нещо друго. Но това е вашето обаждане или иначе.



































