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} ]} ].