Erlang、rebar3で環境毎にアプリケーションの設定値を変える

Oct 26, 2016 ( Feb 11, 2022 更新 )

書き終わってから気づいたけど、まったく同じ内容をQiitaに書いてて自分が信じられなくなった。

まとめ

長くなったので最初にまとめを書いておく。

  • 環境によって変えたい値は、コード中ではapplication:get_envを使って書く
  • rebar3のprofile機能でsys.configを切り替える

configuration file(設定ファイル)と設定値の読み込み

Erlangには設定ファイルとして configuration file というものがある。 これは、 erl -config オプションで起動時に指定することができる。

configuration file は application resource file を上書きする。 application resource fileApplication.app の形式で名前をつけられている。 Erlangのapplicationを起動するときにこの application resource file が参照される。application resource file には application をどのように起動するかの設定を書く。

configuration file の設定値は、erlのコマンドラインオプションで上書きすることもできる。

rebar3とsys.config

rebar3はリリースツールとして内部でrelxを使っている。 rebar3 new release my_server でプロジェクトを作成すると、下記のようなディレクトリ構成となる。

./
├── README.md
├── apps
│   └── my_server
├── config
│   ├── sys.config
│   └── vm.args
├── rebar.config
└── rebar.lock

rebar3 releaserebar3 tar でリリースパッケージを作成すると、_build/<profile>/rel/my_server/bin/my_server というErlangアプリケーションの起動ファイルを生成してくれる。 このシェルスクリプトの内部で、 config/sys.configerl -config に configuration file として指定される。 ※ また、 config/vm.argserl -args_file に指定されるファイルとなる。

sys.config ファイルは以下のように書くことができる。

[
  {my_server, [
    {redis_host, "localhost"},
    {redis_port, 6379}
  ]}
]

上記の sys.config を使うと、Erlangのapplicationのコードでは以下のようにして変数を取り出すことができる。

{ok, Host} = application:get_env(my_server, redis_host).

rebar3のprofile機能

rebar3にはprofileという機能がある。 rebar.configには、以下のようにしてprofileごとに設定を書くことができる。

例えば、以下は production という profile にのみ適用される relx の設定を書いている。

{profiles, [
  {production, [
    {relx, [
      {dev_mode, false},
      {include_erts, true},
    ]}
  ]}
]}.

profile を適用して rebar3 を実行するときは、 as を使う。

rebar3 as production tar

profileを使ってsys.configを切り替える

profile 設定内の relx の設定で、参照する sys.config を変えることができる。 例えば以下のように production, staging とprofileを分けて書いておけば、

{profiles, [
  {staging, [
    {relx, [
      {sys_config, "./config/sys.config.staging"}
    ]}
  ]}
  {production, [
    {relx, [
      {dev_mode, false},
      {include_erts, true},
      {sys_config, "./config/sys.config.production"}
    ]}
  ]}
]}.

前述したように as を使って読み込む設定値を変えることができる。

rebar3 as production tar
Return to top