書き終わってから気づいたけど、まったく同じ内容をQiitaに書いてて自分が信じられなくなった。
まとめ
長くなったので最初にまとめを書いておく。
- 環境によって変えたい値は、コード中では
application:get_env
を使って書く - rebar3のprofile機能でsys.configを切り替える
configuration file(設定ファイル)と設定値の読み込み
Erlangには設定ファイルとして configuration file というものがある。
これは、 erl -config
オプションで起動時に指定することができる。
configuration file は application resource file を上書きする。
application resource file は Application
.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 release
や rebar3 tar
でリリースパッケージを作成すると、_build/<profile>/rel/my_server/bin/my_server
というErlangアプリケーションの起動ファイルを生成してくれる。
このシェルスクリプトの内部で、 config/sys.config
は erl -config
に configuration file として指定される。
※ また、 config/vm.args
は erl -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