Erlang の application behaviour でコマンドライン引数をとる方法

背景

make check でテストを silent に実行し、make vcheck で verbose に実行するということを実現したかった。
error_logger を利用しているので端末にログを出すかどうかは

error_logger:tty(false)

のように制御できる。
このフラグをコマンドラインから渡したい。

方法

概要は以下の通り。

  1. application behaviour 用に「アプリケーション名.app」 ファイルを用意
  2. 「アプリケーション名.app」 にフラグのデフォルト値を指定
  3. コードからフラグを取得
  4. 起動時にコマンドライン引数でフラグのデフォルト値を上書き


application behaviour 用に「アプリケーション名.app」 ファイルを用意し、今回は debug という名前でフラグを設定。

{application, mio,
 [{description, "mio"},
  {vsn, "1"},
  {modules, [mio]},
  {registered, [mio]},
  {applications, [kernel, stdlib]},
  {mod, {mio,[]}},
  {debug, false} %% これがフラグ
 ]}.

フラグは application:get_env/2 で取得できる。第一引数はアプリケーション名。

{ok, IsDebugMode} = application:get_env(mio, debug)

起動時にフラグを true で上書き。

erl -mio -noshell -noinput -pa ebin mio -s mio start -mio debug true

以上。