ElixirのMixはデフォルトでconfig/runtime.exs
を読み込みます。さらに任意の設定ファイルも読み込みたい場合は、mix releaseの:config_providers
オプションで設定ファイル読み込みの挙動をカスタマイズすることができます。
Jason AxelsonさんがCode BEAM Americe 2022で披露されたNervesプロジェクトで:config_providers
が使用されています。参考になります。
Nervesファームウエアで隠しファイルに書かれた設定を/data
フォルダから読み込むのに利用されているようです。
mix releaseの:config_providers
オプション
- Config.Provider behaviourを実装する設定供給モジュールを含むタプルのリスト
- デフォルトは
[]
mix.exs
defmodule HelloNerves.MixProject do
use Mix.Project
...
def project do
[
app: @app,
version: @version,
elixir: "~> 1.12",
archives: [nerves_bootstrap: "~> 1.9"],
start_permanent: Mix.env() == :prod,
deps: deps(),
releases: [{@app, release()}],
preferred_cli_target: [run: :host, test: :host]
]
end
...
def release do
[
+ config_providers: [
+ {Config.Reader, "/data/.target.secret.exs"}
+ ],
overwrite: true,
cookie: "#{@app}_cookie",
include_erts: &Nerves.Release.erts/0,
steps: [&Nerves.Release.init/1, :assemble],
strip_beams: [keep: ["Docs"]]
]
end
...
end
Config.Provider behaviour
- システム起動時に外部設定を読み込むAPI(init/1とload/2)
- 通常、mix releaseで使用される
Config.Reader
- Elixir標準のConfig.Provider behaviourの実装
- 読み込みたいファイルのパスを指定するだけなら、Config.Readerで十分そう
自分で実装する
自分で実装するする場合は以下の二つの関数(Config.Provider callbacks)を実装します。
- init/1
- load/2
ご参考までに