1

这是我能想到的最基本的应用程序,我不明白为什么应用程序模块功能的 start/2 不会记录消息。这是我所做的:

1)应用配置文件(test_app.app):

{application,test_app,
             [{description,"Test App"},
              {vsn,0.9},
              {applications,[kernel,stdlib]},
              {modules,[test_app,log_utils]},
              {registered,[test_app]}]}.

2)应用程序模块(test_app.erl):

-module(test_app).
-behaviour(application).
-export([start/2, stop/1]).
-export([test/0]).

start(_Type, _Args) ->
    log_utils:info("here at APP START 1"),
    master_sup:start_link({10,20,30}). 

stop(_State) ->
    ok.

test() ->
    log_utils:info("here at APP START 2"),
    master_sup:start_link({10,20,30}).

然后我这样编译和测试:

1> application:start(test_app).
ok
2> test_app:test().
==INFO REPORT==== 27-Oct-2013::19:53:29 ===
"here at APP START 2"

所期望的是 application:start(test_app) 将执行 start/2 函数并以与 test/0 函数类似的方式记录消息。

事实上,我有一个更复杂的例子,我启动了一个主管,但同样,我在 app 模块中创建的 API 会导致一个错误,表明 start_link 不起作用。如果我调用一个启动主管的测试函数,那么它就可以工作。

4

1 回答 1

7

您需要为.app提供应用程序回调模块和启动参数的文件添加一个额外选项。没有隐式回调模块名称,如果没有给出,则不会启动任何进程。选项是{mod,{CallBackMod,StartArgs}}这样整个.app文件将变为:

{application,test_app,
 [{description,"Test App"},
  {vsn,0.9},
  {applications,[kernel,stdlib]},
  {modules,[test_app,log_utils]},
  {registered,[test_app]},
  {mod,{test_app,[]}}]}.

test_app在您的情况下,第二个元素是应用程序的名称,而不是回调模块;它们不必相同。如果给出回调,Mod:start/2则将在应用程序启动和Mod:stop/1应用程序停止时调用。

请注意,应用程序在启动时不必运行任何进程,例如stdlib应用程序不需要。

您将在Applications中找到更好的描述。

于 2013-10-28T02:21:17.577 回答