ruby gem для автоматической перезагрузки конфигурационных файлов во время выполнения

#ruby #gem

#ruby #rubygems

Вопрос:

Я ищу ruby gem (или идею его разработки), который может обновлять конфигурационные файлы (yaml) во время выполнения. Чтобы я мог сохранять в переменной и использовать их.

Ответ №1:

В Configurabilty есть объект config (раскрытие: я автор), который вы можете использовать либо сам по себе, либо как часть набора конфигураций. Из документации:

Конфигурируемость также включает в себя Configurability::Config довольно простой класс объектов конфигурации, который можно использовать для загрузки файла конфигурации YAML, а затем представить как хэш-подобный, так и структурный интерфейс для чтения разделов конфигурации и значений; он предназначен для использования в паре с конфигурируемостью, но он также полезен сам по себе.

Вот краткий пример, демонстрирующий некоторые из его функций. Предположим, у вас есть конфигурационный файл, который выглядит следующим образом:

 --- 
database: 
  development: 
    adapter: sqlite3
    database: db/dev.db
    pool: 5
    timeout: 5000
  testing: 
    adapter: sqlite3
    database: db/testing.db
    pool: 2
    timeout: 5000
  production: 
    adapter: postgres
    database: fixedassets
    pool: 25
    timeout: 50
ldap: 
  uri: ldap://ldap.acme.com/dc=acme,dc=com
  bind_dn: cn=web,dc=acme,dc=com
  bind_pass: Mut@ge.Mix@ge
branding: 
  header: "#333"
  title: "#dedede"
  anchor: "#9fc8d4"
  

Вы можете загрузить эту конфигурацию следующим образом:

 require 'configurability/config'
config = Configurability::Config.load( 'examples/config.yml' )
# => #<Configurability::Config:0x1018a7c7016 loaded from 
    examples/config.yml; 3 sections: database, ldap, branding>
  

А затем получить к нему доступ, используя методы, подобные struct:

 config.database
# => #<Configurability::Config::Struct:101806fb816
    {:development=>{:adapter=>"sqlite3", :database=>"db/dev.db", :pool=>5,
    :timeout=>5000}, :testing=>{:adapter=>"sqlite3",
    :database=>"db/testing.db", :pool=>2, :timeout=>5000},
    :production=>{:adapter=>"postgres", :database=>"fixedassets",
    :pool=>25, :timeout=>50}}>

config.database.development.adapter
# => "sqlite3"

config.ldap.uri
# => "ldap://ldap.acme.com/dc=acme,dc=com"

config.branding.title
# => "#dedede"
  

или с использованием хэш-подобного интерфейса с использованием Symbol s, String s или сочетания
оба:

 config[:branding][:title]
# => "#dedede"

config['branding']['header']
# => "#333"

config['branding'][:anchor]
# => "#9fc8d4"
  

Вы можете установить его через интерфейс конфигурирования:

 config.install
  

Проверьте, изменился ли файл, из которого он был загружен, с тех пор, как вы
загрузил его:

 config.changed?
# => false

# Simulate changing the file by manually changing its mtime
File.utime( Time.now, Time.now, config.path )
config.changed?
# => true
  

Если он изменился (или даже если этого не произошло), вы можете перезагрузить его, что автоматически переустановит его через интерфейс конфигурируемости:

 config.reload
  

Вы можете вносить изменения через те же интерфейсы, похожие на структуру или хэш, и записывать измененную конфигурацию обратно в тот же файл:

 config.database.testing.adapter = 'mysql'
config[:database]['testing'].database = 't_fixedassets'
  

затем сбросьте его в строку YAML:

 config.dump
# => "--- ndatabase: n  development: n    adapter: sqlite3n   
    database: db/dev.dbn    pool: 5n    timeout: 5000n  testing: n   
    adapter: mysqln    database: t_fixedassetsn    pool: 2n    timeout:
    5000n  production: n    adapter: postgresn    database:
    fixedassetsn    pool: 25n    timeout: 50nldap: n  uri:
    ldap://ldap.acme.com/dc=acme,dc=comn  bind_dn:
    cn=web,dc=acme,dc=comn  bind_pass: Mut@ge.Mix@genbranding: n 
    header: "#333"n  title: "#dedede"n  anchor: "#9fc8d4"n"
  

или запишите его обратно в файл, из которого он был загружен:

 config.write
  

Комментарии:

1. Это очень полезно, когда дело доходит до кэширования информации в файлах конфигурации во время выполнения. У меня есть такие случаи, и с этим довольно легко справиться прямо сейчас. Спасибо!

Ответ №2:

Используя, например, Watchr или Guard, вы можете отслеживать файлы и реагировать на внесенные в них изменения.

Фактическое действие, которое необходимо предпринять при изменении файла, полностью зависит от ваших конкретных настроек и ситуации, так что здесь вы предоставлены сами себе. Или вам нужно предоставить дополнительную информацию.