Слияние хешей в YAML файлы конф
YAML это очень удобно для записи файлов конфигурации. Основным преимуществом является то, что он читает, как текстовый файл. Это работает очень хорошо, если ваш файл конфигурации квартира (нет иерархии) и не имеет повторений.
Если ваш файл конфигурации повторов, то имеет смысл выделить те элементы и использовать их. Что я имею в виду это - скажем, вы конфигурационный файл выглядит следующим образом:
развития: input_location: common_input output_location: dev_location почта: smtp_server: your_server Логин: ваш_логин Пароль: top_secret Производство: input_location: common_input output_location: dev_location почта: smtp_server: your_server Логин: ваш_логин Пароль: top_secret
Предполагая выше код в / TMP / test.yml вот как вы можете прочитать в питоне и рубин
$cat readyml.py
#! / USR / бен / ENV питон pprint от импорта pprint как пп # В Debian необходимо установить Python-YAML YAML от импорта нагрузки, load_all, самосвалы хэш = нагрузки (открытой ('/ TMP / test.yml)) рр (хэш ['развитие'])
$ cat readyml.rb
#! / USR / бен / ENV рубин require 'рр' хэш = YAML :: нагрузки (File.Open ('/ TMP / test.yml). читать) стр. хэш ['развитие']
Здесь удобная один лайнер для версии рубиновых
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' или вы можете попробовать то же самое в IRB или питона консоли.
Обратите внимание, что в приведенном выше фрагменте кода, все, кроме выходных Место же в разработке и производстве части. Здесь ут идентификатор узла идет к спасению. Идея проста есть набор значений по умолчанию и переопределить их в другом месте.
Вы могли бы вытащить его на части следующим образом:
По умолчанию: и по умолчанию input_location: common_input output_location: dev_location почта: SENDER_NAME: отправитель smtp_server: your_server Логин: ваш_логин Пароль: top_secret развития: << * По умолчанию Производство: << * По умолчанию output_location: prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Великий, он работает (тм)!.
Возможно мы обменяли некоторую ясность в немного магии. Вот небольшое объяснение: и * и <<: и которая тега может быть понята как идентификатор узла, * является узлом ссылки и <<: обозначает хэш слияния.
Для получения дополнительной информации см. или YAML спецификации или Википедии
Пока все хорошо, но есть загвоздка, эти хэш слияния не рекурсивным. Что это означает, заключается в следующем: допустим, вы хотите иметь другое имя отправителя почты в двух средах, вы можете захотеть сделать следующее:
По умолчанию: и по умолчанию input_location: common_input output_location: dev_location почта: SENDER_NAME: отправитель smtp_server: your_server Логин: ваш_логин Пароль: 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 Логин: ваш_логин Пароль: 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 конфигурационный файл, чем копаться в YAML или что-то другое. Но это ваш звонок в любом случае.
Комментарии
- сторожит
- søgemaskineoptimering
- Бенджамин "balupton" Lupton



































