這是我要做的事(聲明,我只是寫了,所以它沒有單元測試還沒有等...因爲我改進它,我會更新這個):
require 'yaml'
# read config files (currently only yaml supported), merge user config files over
# defaults and make the parsed data available to the rest of your application.
#
module YourNamespace class Config
attr_reader :files, :get
# Accepts a string filename or an array of string filenames to parse.
# If an array is supplied, values from later files will override values
# of earlier files with the same name.
# Will choke if YAML.load_file returns false (invalid or empty file)
#
def initialize(files)
@files = files.respond_to?('map') ? files : [ files ]
@get = @files \
\
.map { | file | YAML.load_file file } \
.reduce({}, :merge!)
;
end
end end
你可以這樣稱呼它:
config = YourNamespace::Config.new 'config.yml'
# or have the second one override the first
#
config = YourNamespace::Config.new [ 'config-defaults.yml', 'config.yml' ]
如果你想去看看,這裏有很多改進的餘地。理想的做法是將'Config'作爲一個不涉及文件的界面,並且在YamlConfig
,IniConfig
,CliConfig
,DbConfig
,CookieConfig
中實現。這樣,如果你決定有一天那個新的配置格式超級播種yaml是如此酷,你可以很容易地改變它,而不會破壞任何東西。你可以讓命令行配置選項輕鬆地覆蓋來自配置文件的配置選項。而且,無論配置值來自哪裏,您都可以爲任何ruby項目重新使用配置模塊。或者,也許只是停止inventing hot water。快速瀏覽讓我覺得那裏有一些相當熱水...
接下來編寫一些文檔,單元測試,輸入驗證,錯誤處理併爲配置值創建一些花哨的讀/寫訪問器。也許你希望能夠請求這樣的配置值,而不是一直寫數組和哈希:
config.get 'app.component.section.setting'
# or this if you want to keep them separate:
#
config.get('app', 'component', 'section', 'setting')
來源
2014-05-01 15:04:46
nus
另請參見[** Snappconfig **](https://github.com/ ykessler/snappconfig)gem – Yarin 2013-09-24 10:56:16