Hatena::Grouperlang

檜山正幸のErlang未確認情報 RSSフィード

 | 

2009-01-16 (金)

helloをちゃんと作る (7) appファイルを準備

| 09:58

※なぜか今回は「ですます」調。

そろそろappファイルを作ることにします。

アプリケーションの諸特性を記述するファイルをアプリケーションリソースファイル(application resource file)と呼び、ネーミングは必ず Application.app で、アプリケーションのebinディレクトリに置きます。アプリケーションリソースファイルの中身となるターム(データ)は、アプリケーションリソースじゃなくてアプリケーション仕様(application specification)と呼びます。(だったら、.appファイルを「アプリケーション仕様ファイル」と呼べばいいのに。)

アプリケーション仕様タームの形式は:

{application, Application,
  [{description,  Description},
   {id,           Id},
   {vsn,          Vsn},
   {modules,      Modules},
   {maxP,         MaxP},
   {maxT,         MaxT},
   {registered,   Names},
   {included_applications, Apps},
   {applications, Apps},
   {env,          Env},
   {mod,          Start},
   {start_phases, Phases}]}.

             Value                Default
             -----                -------
Application  atom()               -
Description  string()             ""
Id           string()             ""
Vsn          string()             ""
Modules      [Module]             []
MaxP         int()                infinity
MaxT         int()                infinity
Names        [Name]               []
Apps         [App]                []
Env          [{Par,Val}]          []
Start        {Module,StartArgs}   undefined
Phases       [{Phase,PhaseArgs}]  undefined
  Module = Name = App = Par = Phase = atom()
  Val = StartArgs = PhaseArgs = term()

このなかでmaxP(最大プロセス数)は廃止予定だそうで無視。maxT(最大走行時間)もたいてい不要でしょう。included_applicationsとstart_phasesはよくわからない、書かなくてもいいようなので省略。

で、 helloに関してはこんな感じでしょう。

{application, hello, % アプリケーション名はアトムである点に注意
  % 以下に記述項目のリスト
  [
   {description,  "hello application"},
   {id,           "hell-1.0"}, % idはシステムが使うわけではないので何でもよい
   {vsn,          "1.0"}, % ドットでつないだ数値を使うのが無難
   {modules,      % helloアプリケーションを構成するすべてのモジュール名を列挙
     [hello_impl, hello_server, hello_sup, hello_api, hello_app, hello]},
   {registered,   % helloアプリケーションで登録する名前を列挙
     [hello_server, hello_sup]},
   {applications, [kernel, stdlib]},
   {env,          % 環境変数=構成パラメータ
     [{whom, "world"}]},
   {mod,          {hello_app, none}}
  ]
}.

まだ作ってないモジュールは hell_appとhello。環境変数=構成パラメータに関してはまた別に述べます。構成パラメータを導入すると、今までのソースを多少書き換えることになります。

アプリケーション仕様をアプリケーションコントローラに登録すれば、アプリケーションを構成するOTP監視ツリーを application:start(hello) により開始できます。application:start/{1,2}は、アプリケーションマスターを生成して、そのマスターが指定されたアプリケーション・コールバックモジュールのstart/2を呼ぶので、この場合 hello_app:start(normal, none) によりhelloアプリケーションが始動します。

アプリケーション始動と終了のメカニズムは、ちとややこしいので別の機会に。

[追記]マニュアルページを見ると、AppDescr(Descrはdescriptionかdescriptorだろう)なんて言葉も出てきて:

AppDescr = Application | AppSpec
 Application = atom()
 AppSpec = {application,Application,AppSpecKeys}
  AppSpec = [{Key,Val}]
   Key = atom()
   Val = term()

つまり、アプリケーション記述子とは、アプリケーション名であるアトムか、またはアプリケーション仕様タームのこと。

[/追記]

HanifiHanifi2012/08/22 11:29You're a real deep thinker. Thanks for shirnag.

pygfyhupjxlpygfyhupjxl2012/08/23 11:12As6z7f <a href="http://cowginndvfpg.com/">cowginndvfpg</a>

llocxwllocxw2012/08/23 23:29XEFmcR , [url=http://dogvxngagqhp.com/]dogvxngagqhp[/url], [link=http://nmsockevbivx.com/]nmsockevbivx[/link], http://ofyztelvpity.com/

krkbcsrnikrkbcsrni2012/08/24 20:45XCGiSf <a href="http://vgiwbhyixirk.com/">vgiwbhyixirk</a>

 |