Application.get_env/3
値を設定する方法について確認した。
get_env
で取得できる値はApplication Environmentといって環境変数はSystem Environmentといって区別するらしい。(こちらはSystem.get_env/1
で取得できる)
以下の場所で設定できる(下に書いたものほど優先順位が高いようだ。
-
mix.exs
のapplication/0
の実装に記述する -
erl
コマンドの-config
オプションにconfigファイルを指定する -
config/config.exs
の中で指定する -
Application.put_env/4
を呼び出す
mix.exs
の application/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
も使える。
例
[{
appenv, [
{value, <<"load 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/1
で Application.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"
実行例
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