Erlang でアプリケーションをパッケージングする定石作法について
OTPアプリケーション
Erlangアプリとは、関連するコード
とプロセス
の集まり。
- OTPアプリケーションとは
- プロセスに対してOTPビヘイビアを適用している
- アプリ全体の構築と解体方法をVMに伝えることができる特別な構造で、そのプロセスをラップしている
OTPアプリケーションは、以下を提供する
- ディレクトリ構造
- 統一的な設定方法
- 環境変数と設定の生成方法
- 依存関係を考慮しつつアプリケーションを起動停止する方法
- アプリケーションを終了することなく, 衝突を検知し, ライブアップデートを安全に制御する手段
OTPコンポーネント != OTPアプリケーション
なお、すべてのOTPアプリケーションは kernel
と stdlib
に依存する.
アプリケーションリソースファイル
拡張子 .app
のファイル.
中身はErlang項が書かれており, ErlangVMにアプリケーションについての情報を伝える.
このファイルはアプリケーションのエントリポイントや終了方法などを伝える.
これは、コンパイル済みのモジュールと一緒に /ebin
に保存する
.app.src
というファイルを src/
以下に置く場合もある。
その場合, コンパイル時に app.src
が app
になって /ebin
に置かれる.
好みの問題だが、現在はこのパターンが主流.
書式の例は以下
{application,
myapp, %% アプリケーションの名前をatomで指定
[{description, "アプリの説明文をここに"},
{vsn, "0.1.0"}, %% バージョンを指定. コードのホットスワップ時にも使用される
{registered, []}, %% アプリケーションによって登録されるレジスタ名のリスト
{mod, { myapp_app, []}}, %% applicationビヘイビアを実装したコールバックモジュールと引数を指定
%% ここを記述しない場合はライブラリアプリケーションとして扱われる
%% 依存するアプリケーションをリストで指定する
%% 全てのOTPアプリケーションはkernel と stdlib に依存している
%% ここで指定されたアプリが先に起動する
{applications,
[kernel,
stdlib
]},
{env,[
{hoge, "FUGA"} %% 環境変数を指定
]},
{modules, []}, %% rebar を使っているなら自動で処理される箇所
{maintainers, []},
{licenses, ["Apache 2.0"]},
{links, []}
]}.
アプリケーションビヘイビア
-
アプリケーションコントローラ(AC)
- ErlangVMが起動するときに、一緒に起動されるプロセス
- ACは他の全てのアプリケーションを起動し、それらの上位に位置する.
- 実質、各アプリケーションのスーパーバイザのような立ち位置
-
アプリケーションマスター
- アプリケーションを起動するとき、ACが起動するプロセス
- 各アプリケーションを世話する、2つからなるプロセス.
AC --> アプリケーションマスター --> 各アプリケーションのスーパーバイザ
という構造.
アプリケーションビヘイビアのコールバック関数
アプリケーションビヘイビアが必要とするコールバック関数は以下の2つ
- start/2
-
YourMod:start(Type, Args)
という形式 - Type は常に
normal
- Args はアプリケーションリソースファイルの
{mod, ...}
からから取得されるオプション - start はアプリケーションの初期化を行い、最上位のスーパーバイザのpidを返す
-
- stop/1
- start/2 で返される状態を引数に受け取る
- アプリケーションの実行が終了したあとに動作し、必要な終了処理を行う
applicationモジュールの関数
-
application:start(AppName).
- アプリケーションコントローラに対して指定したOTPアプリケーションを起動するように伝える.
- 第二引数にプロセスタイプを指定可能
-
temporary
- 正常終了は再起動しない
- エラーで落ちても再起動しない
-
transient
- 正常終了は再起動しない
- 異常終了のとき、他のアプリケーションも停止してVMも止まる
-
permanent
- 正常終了のとき他のアプリケーションも終了し、VMも止まる
- 異常終了のとき、正常終了と同じ動作
-
-
application:which_applications
- 現在起動しているアプリケーションのリストを取得できる
ライブラリアプリケーション
特に起動するプロセスがないモジュールを、アプリケーションとしてラップしたい場合がある.
stdlib
などはライブラリアプリケーション.
ライブラリのときは、アプリケーションリソースファイルから、 {mod, {Module, Args}}
を削除する.
参考リンク
- 公式ドキュメント