Posted at

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


関連