Слияние хешей в YAML файлы конф

31 июля 2009 по Prashant
Рубрики: технологии

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 или что-то другое. Но это ваш звонок в любом случае.

Комментарии

  • Полный 453-страничный документ также перечисляет потенциальные области
    консолидации, в том числе приватизации мусора, слияние города и
    Wayne County департаментов здравоохранения и партнерские отношения с Detroit Public Schools на
    отдыха. Это предложение не было ни одного ...

  • Человек, знакомый со сделкой заявил, что обе стороны все еще хэширования из названия для объединенной компании. Но этот человек сказал, идея рассматривается является выбор названия, которое не есть слово "Дойче" или сокращенно "NYSE" в нем. ...

  • Да, неприятно, не сливается рекурсивно. Я был в состоянии сделать обходной путь в моей balphp библиотеки.

комментарии блога двигались на большой скорости Diskus