config ファイルの楽な読み込み方(application を使う場合、限定)

erlang 付属の httpd や yaws 等は、設定ファイルを自力で開き、読み込み、値を確認して…とやっている。
何か楽をできる良い方法は無いものか?と思い調べたらあったのでメモを残す。

erl コマンドには便利な -config オプションがある。

% erl -config test

と実行すると、./test.config という名前の設定ファイルを読み込んでくれる。
ただし、読み込んだ値は application から値を参照する必要がある。

以前、id:cooldaemon:20070826:1188094671 で作った application を利用して試す。

% cat test.config
[{test, [
  {key1, value1},
  {key2, value2}
]}].

% erl -config test
1> application:start(test).
test start!!
ok
2> application:get_all_key(test).
{ok,[{description,"test applications."},
     {id,[]},
     {vsn,"1"},
     {modules,[test_app,sup,counter,code_lock]},
     {maxP,infinity},
     {maxT,infinity},
     {registered,[sup,counter,code_lock]},
     {included_applications,[]},
     {applications,[kernel,stdlib]},
     {env,[{key1,value1},{included_applications,[]},{key2,value2}]},
     {mod,{test_app,["testcode"]}},
     {start_phases,[]}]}
3> application:get_all_env(test).
[{key1,value1},{included_applications,[]},{key2,value2}]
4> application:get_env(test, key1).
{ok,value1}
5> application:get_env(test, key2).
{ok,value2}

上記の例から、-config は、app ファイルの env を別ファイルで記述する為のオプションである事が解る。
ちなみに、app ファイルに {env, [{key3, value3}]} を加えても正しく merge されるが、config ファイルと重複した値を設定した場合は、config ファイル側の設定が有効となる。

この方法を使う事で、ファイルの読み込み方法を考える必要なく、必要に応じて、値の確認やデフォルト値の設定だけ行えば良い事になる。
値の設定は、application:set_env/3 で行える。

httpd や yaws は、erlang の書式で設定ファイルを書かせるのが嫌だったのかな?

sasl と共存

id:cooldaemon:20070918:1190085199 で紹介した sasl も -config を使うので、共存させる場合は、下記のように config ファイルを書く。

[{sasl, [
  {sasl_error_logger, false},
  {errlog_type, error},
  {error_logger_mf_dir, "/path/to/logs"},
  {error_logger_mf_maxbytes, 10485760}, %% 10MB
  {error_logger_mf_maxfiles, 10}
 ]},
 {test, [
  {key1, value1},
  {key2, value2}
 ]}
].