Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

関連

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした