環境ごとに設定ファイルを分けたいなら,rails_config + figaroの組み合わせが最高に便利

みなさんさようなら.

Railsでプロジェクトをいくつか作っていくうちに,だんだん設定ファイルの管理の仕方もなれてきて,一番便利そうなところに落ち着きました.

それが,

rails_config + figaro
の組み合わせです.

rails_config

概要をまず説明しますが,rails_configはconfig/settings.ymlに記述されている内容を,環境ごとに分けて管理したいときに便利です.
https://github.com/railsjedi/rails_config

例えば,普段ローカルで開発している限りは

host: localhost:3000

としておきたいけど,いざ本番production環境では

host: www.test.com

みたいにしたいときに便利です.


こういう分け方をするGemとしては,rails_config以外だとsettingslogicが有名ですね.
https://github.com/binarylogic/settingslogic


ただ,rails_configの方が,config/settings/に環境ごとのymlファイルが作成できるし,git管理したくないときなどには,config/settings/development.local.ymlとすることで,config/settings/development.ymlの内容を上書きして,設定項目として読み込んでくれます.


こっちの方が俺は好みでした.


figaro

次に,figaroですが,こちらは環境変数の設定をすることができます.

いわゆる,普段~/.bashrcや~/.bash_profile,~/.zshrcなんかに記述する環境変数を設定できます.
これが何の役に立つかというと,config/database.ymlの設定に使います.



rails_configは環境ごとに設定項目を設定できると言いましたが,database.ymlに記述される内容も,ほとんどの場合は環境ごとに違います.
そして,データベースの接続情報,特にパスワードなどはgit管理したくないですよね.

とすれば,先ほどのrails_configで,〜local.yml内に記述すればいいのでは?

と思うところですが,違います.



settings.yml並びにその他rails_config,settingslogicで使用するyml設定ファイルは,Railsアプリケーションのinitializeの途中で読み込まれ,設定項目が反映される仕組みになっています.

しかし,database.ymlはそれより早いタイミングで読み込まれています.


そのため,一般的には~/.bashrcなどの環境変数として設定し,database.ymlには,

development:
  adapter: mysql2
  encoding: utf8
  database: <%= ENV['HOGE_DEVELOPMENT'] %>
  username: <%= ENV['HOGE_NAME'] %>
  password: <%= ENV['HOGE_PASS'] %>
  port: <%= ENV['HOGE_PORT'] %>
  socket: <%= ENV['HOGE_SOCK'] %>

....


のように記述します.


つまり~/.bashrcにはこれらの変数,HOGE_DEVELOPMENTやHOGE_NAMEなどを環境変数として設定しておく必要があります.もちろん本番環境も同じですね.


となると,多くのプロジェクトを同時に開発しているときには,~/.bashrcが大変な長さになってしまいます.

それをプロジェクト内で管理したいがために,figaroというGemを使います.
https://github.com/laserlemon/figaro



figaroは,環境変数を設定することができます.

config/application.ymlを生成し,Railsアプリケーション起動時に,そこに設定された項目が環境変数として反映されます.


config/application.ymlはgit管理外となるため,このファイルに

HOGE_DEVELOPMENT: hoge_databasename
HOGE_NAME: hoge
HOGE_PASS: hogehogehoge
HOGE_PORT: 3306

と書いておけば,先ほどのdatabase.ymlで読み込んでくれます.


application.yml.sampleなどのように,サンプルを作成しておいてgit管理に含めておくと,複数人で開発するときにはわかりやすくて便利です.






あ,インストール方法などはgithubのreadmeを参照してください.
どれもGemとして配布されているのでわかりやすいですよ.