嗨各位,我又来老王卖瓜了:
Settei 是一个用来取代 Settingslogic/dotenv/figaro 的 gem,让你使用 YAML 管理你的配置,但是又能把 YAML 用 env var 的方式部署到远端,符合 Heroku 所宣传的 12-factor app 概念。
https://github.com/lulalala/settei
12-factor app 是一套让部属更容易的规则。其中第三点指到,要把配置跟程式分开,并把配置存在环境(变数)中。
但是使用环境变数有很多缺点,要是你的程式有 30 项大大小小的配置,光是命名变数名称就会很麻烦:
# 传统使用 ENV 就得写一长串超累:
BOARD_PAGINATION_PER_PAGE=5
BOARD_PAGINATION_MAX_PAGE=10
BOARD_REPLY_OMIT_CONDITION_N_RECENT_ONLY=5
BOARD_REPLY_OMIT_CONDITION_AVOID_ONLY_N_HIDDEN=2
使用 YAML 就简单很多
board:
pagination:
per_page: 5
max_page: 10
reply_omit_condition:
n_recent_only: 5
avoid_only_n_hidden: 2
但是要怎样结合 YAML 的优势跟 ENV VAR 的优势呢?
我的想法是:把 YAML 给 serialize 成一串文字,就能当 env var 传到远端了。
本机开发跟远端部属的两个流程如下:
用 Gemfile 安装以后:
gem 'settei'
在 rails 专案下执行以下 rake task 继续安装:
$ rake settei:install:rails
要是 config/environments/default.yml
内容是这样的话:
the_answer_to_life_the_universe_and_everything: 42
google:
api: foo
就能这样取得配置
Setting.dig(:the_answer_to_life_the_universe_and_everything)
Setting.dig(:google, :api)
要是你是使用 capistrano 或是 mina 的话,应该自动会有效。我塞了 code,所以 deploy 时,你的 production.yml 会直接变成 Env var 随着远端的 Rails server 启动。于是远端的 server 也就拿到了配置。
要是你是使用 heroku 的话,使用 rake settei:heroku:config:set app=[app_name]
来把 production.yml 上传到指定的 app 中。
更详尽的使用方法请阅读 github,也欢迎指教~~