ElixirのConfigに関する議論が盛り上がっている
これ
課題意識としては、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に使われる設定が混在してるの気持ち悪くないか?とか。これは今もそうだし、今回の提案が取り込まれても同じ)に行っている感じもあるけど、大注目スレッドであることは間違いないので今後もウォッチしてく。