Elixir
OTP

Application.get_env/3で取得できる値の設定方法の確認

Application.get_env/3 値を設定する方法について確認した。
get_envで取得できる値はApplication Environmentといって環境変数はSystem Environmentといって区別するらしい。(こちらはSystem.get_env/1で取得できる)

以下の場所で設定できる(下に書いたものほど優先順位が高いようだ。

  1. mix.exsapplication/0の実装に記述する
  2. erlコマンドの-configオプションにconfigファイルを指定する
  3. config/config.exsの中で指定する
  4. Application.put_env/4を呼び出す

mix.exsapplication/0の実装に記述する

ここに書いた場合.appファイルに記載される。そのため一番優先度が低いようだ。

  def application do
    [
      extra_applications: [:logger],
      env: [value: "load mix.exs"]
    ]
  end

確認

$  mix run -e 'Application.get_env(:appenv, :value) |> IO.inspect'
"load mix.exs"

erlコマンドの-configオプションにconfigファイルを指定する

erlangでの上書き方法と考えれば良さそう。erlangのタプルで記述しないといけないのでが少しつらそう。
環境変数ELIXIR_ERL_OPTIONSが使える。コマンドによって--erlも使える。

value.config
[{
  appenv, [
    {value, <<"load value.config">>}
  ]
}].

https://github.com/eiel-sample-code/elixir_app_env/blob/master/value.config

確認

$ env ELIXIR_ERL_OPTIONS="-config value.config" mix run -e 'Application.get_env(:appenv, :value) |> IO.inspect'
"load value.config"
$ iex --erl '-config value.config' -S mix
iex> Application.get_env(:appenv, :value)

"load value.config"

config/config.exsの中で指定する

よくでてくるので周知されてると思う。

mix経由での起動でないと使われなさそうなのが気になるところ。デプロイツールによっては良い感じにやってくれるのかもしれない。(よく知らない)
Mix.Config.persist/1Application.put_env/4を呼ぶという仕組み。
https://github.com/elixir-lang/elixir/blob/v1.7.4/lib/mix/lib/mix/config.ex#L304

config :appenv, value: "load config.exs"

https://github.com/eiel-sample-code/elixir_app_env/blob/master/config/config.exs#L5

実行例

mix run -e 'Application.get_env(:appenv, :value) |> IO.inspect'
"load config.exs"

Application.put_env/4を呼び出す

要するに実行時にApplication Environmentはいつでも書き換えられる。開発時にREPLの再起動いらずで便利そう。

実行例

$ mix run -e 'Application.put_env(:appenv, :value, 1); Application.get_env(:appenv, :value) |> IO.inspect'
1

関連