LoginSignup
7
1

More than 5 years have passed since last update.

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

Posted at

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">>}
  ]
}].

確認

$ 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"

実行例

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

関連

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1