mmag

ハマったことメモなど

ElixirのConfigに関する議論が盛り上がっている

これ

elixirforum.com

課題意識としては、Mixプロジェクトにおけるconfigはアプリケーションが起動するときに読み込まれるけれど、その一方でそれをreleaseビルドするときはコンパイルするときに読み込まれるという違いがあり、混乱のもとになっている、というもの。よくあるのはSystem.get_env環境変数を読み込む場合で、releaseを動かす環境のものを使ってほしいのに、releaseをビルドした環境のものが使われてしまい、開発中は動いてたのにいざ本番へというところで全然動かない、ということがある。

これをどうやって解決しようか、という話で、提案されているのはconfigのファイルをreleaseの中にコピっちゃおうよ、というもの。ただしそれを行うには問題があって、一般的なMixプロジェクトでは

use Mix.Config

config :my_app, foo: :bar

import_config "#{Mix.env()}.exs"  # <- これ

ということをして動的に設定ファイルを読み込んでいる。これをやられると、releaseにコピーするべき設定ファイルを知るためには一度設定を評価しないといけない。しかもMixはreleaseでは使えない。そこで、mix.exsに新しい項目を増やして、使う設定ファイルを明示的に書いておきましょうよ、ということになっている。

# mix.exs
def project do
  [
    ...,
    config_paths: ["config/config.exs", "config/#{Mix.env()}.exs"]
  ]
end

な感じ。これなら設定ファイルを評価する前にどれをコピーすればいいかわかるし、動的にimport_configする必要がなくなるので、設定の評価時にMixも要らなくなる。またこの変更に伴って、:elixirアプリケーションにApplication.Configってのを入れるよ、ということも言われている。


これを書いている時点でコメントが90ほど伸びていて盛り上がっている。若干議論が横道っぽいとこ(runtimeに使われる設定とcompile timeに使われる設定が混在してるの気持ち悪くないか?とか。これは今もそうだし、今回の提案が取り込まれても同じ)に行っている感じもあるけど、大注目スレッドであることは間違いないので今後もウォッチしてく。