问题 如何运行erlang(rebar build)应用程序


我是Erlang世界的新手,目前无法弄清楚如何启动我的虚拟erlang应用程序。可能,我只是遗漏了一些东西......所以,我用rebar创建了一个应用程序(rebar create-app appid = dummys)。

目前我有

  • rebar.config
  • SRC / dummys.app.src
  • SRC / dummys_app.erl
  • SRC / dummys_sup.erl

我发现为了在开发期间运行应用程序,最好创建一个应该调用application:start(module)的附加start方法。

我在启动方法中添加了一些基本的日志记录。

start() ->
    error_logger:info_msg("Starting app(dev)..~n"),
    application:start(dummys_app).

start(_StartType, _StartArgs) ->
    error_logger:info_msg("Starting app..~n"),
    dummys_sup:start_link().

如果我试试

erl -noshell -pa ebin -s application start dummys
erl -noshell -pa ebin -s application start dummys_app

没有输出..

如果我试试

erl -noshell -pa ebin -s dummys start

erl因错误而崩溃..

如果我试试

erl -noshell -pa ebin -s dummys_app start

它输出只是“启动应用(开发)..“就是这样。但我也希望看到”开始应用..

我错过了什么或做错了什么?

=============

还有一个问题: 如何正确地将新模块添加到我的虚拟应用程序?例如,我有一个名为“* dummys_cool *”的附加模块,它有一个“开始“方法。如何告诉我的应用程序运行”dummys_cool #start“方法?

谢谢!


12212
2018-05-21 17:14


起源



答案:


为了快速开发,如果您只是想确保您的应用程序可以启动,请启动shell,然后启动应用程序:

erl -pa ebin
1> dummys_app:start().

这将为你提供一个干净的指示,告诉你什么是错的,没有贝壳轰炸之后。

由于您要创建一个应用程序来运行,而不仅仅是要共享的库,因此您需要进行发布。钢筋可以帮助你完成大部分工作:

mkdir rel
cd rel
rebar create-node nodeid=dummysnode

编译完应用程序后,可以创建一个版本:

rebar generate

这将构建一个可移植版本,其中包括所有必需的库甚至是erlang运行时系统。这默认放在rel /目录中;在您的情况下rel / dummys。

在该目录中,将有一个控制脚本,您可以使用该脚本来启动,停止和附加到应用程序:

rel/dummys/bin/dummys start
rel/dummys/bin/dummys stop
rel/dummys/bin/dummys start
rel/dummys/bin/dummys attach

12
2018-05-23 17:11



谢谢你的解释!最后,我弄清楚它是如何一起工作的。 - cyrillk
这是一个可靠的建议。似乎语法已经与rebar3有所改变。文档很棒(rebar3.org/docs/releases)。具体来看{dev_mode,true}。 - Albin Stigo


答案:


为了快速开发,如果您只是想确保您的应用程序可以启动,请启动shell,然后启动应用程序:

erl -pa ebin
1> dummys_app:start().

这将为你提供一个干净的指示,告诉你什么是错的,没有贝壳轰炸之后。

由于您要创建一个应用程序来运行,而不仅仅是要共享的库,因此您需要进行发布。钢筋可以帮助你完成大部分工作:

mkdir rel
cd rel
rebar create-node nodeid=dummysnode

编译完应用程序后,可以创建一个版本:

rebar generate

这将构建一个可移植版本,其中包括所有必需的库甚至是erlang运行时系统。这默认放在rel /目录中;在您的情况下rel / dummys。

在该目录中,将有一个控制脚本,您可以使用该脚本来启动,停止和附加到应用程序:

rel/dummys/bin/dummys start
rel/dummys/bin/dummys stop
rel/dummys/bin/dummys start
rel/dummys/bin/dummys attach

12
2018-05-23 17:11



谢谢你的解释!最后,我弄清楚它是如何一起工作的。 - cyrillk
这是一个可靠的建议。似乎语法已经与rebar3有所改变。文档很棒(rebar3.org/docs/releases)。具体来看{dev_mode,true}。 - Albin Stigo


看看你的 dummys.app.src 文件。所有指令的含义都在解释中 'app'手册页,但我怀疑这里缺少的是 mod,表示应用程序回调模块的名称。因此,请确保此行存在:

{mod, {dummys_app, []}}

那里的空列表将作为传递 StartArgs 论证 dummys_app:start/2


要使新模块与应用程序一起启动,请将其添加到监控树中 dummys_sup:init。此功能应如下所示:

init(_) ->
    {ok, {{one_for_one, 10, 10},
         [{dummys_cool, {dummys_cool, start_link, []},
           permanent, brutal_kill, worker, [dummys_cool]}]}.

这在中描述 '主管'联机帮助页,但基本上这意味着在启动时,该主管将启动一个子进程。 dummys_cool:start_link() 将被调用,该函数应该生成一个新进程,链接到它,并返回其进程ID。如果您需要更多进程,只需在列表中添加更多子规范即可。


2
2018-05-21 17:50



谢谢@legoscia。我已经检查了我的app.src文件,mod就在那里 {application, dummys, [ {description, "dummy application"}, {vsn, "1"}, {registered, []}, {applications, [ kernel, stdlib ]}, {mod, { dummys_app, []}}, {env, []} ]}. - cyrillk


erl -noshell -pa ebin -s application start dummys

上面的代码不起作用,因为 application:start([dummys]) 将被召唤。

你可以参考一下 Erlang文档详情。

对于你的情况,

erl -noshell -pa ebin -s dummys

1
2017-10-24 19:21