Rails Settei - 一個 Config 使用 YAML 卻又符合 12-factor app 的 Gem

lulalala · March 08, 2018 · 1530 hits

嗨各位,我又来老王卖瓜了:

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,也欢迎指教~~

1 Floor has deleted
You need to Sign in before reply, if you don't have an account, please Sign up first.