16

我是 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() ->
    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

它只输出“ Starting app(dev).. ”,仅此而已。但我也希望看到“正在启动应用程序..

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

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

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

谢谢!

4

4 回答 4

15

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

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

这将使您清楚地表明什么是错的和什么是对的,而不会随后炮弹轰炸。

由于您正在制作要运行的应用程序,而不仅仅是要共享的库,因此您需要发布。Rebar 可以帮助您完成大部分工作:

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
于 2013-05-23T17:11:01.967 回答
2

看看你的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。如果您需要更多流程,只需将更多子规范添加到列表中。

于 2013-05-21T17:50:09.127 回答
1
erl -noshell -pa ebin -s application start dummys

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

有关详细信息,您可以参考Erlang 文档

对于你的情况,

erl -noshell -pa ebin -s dummys
于 2014-10-24T19:21:12.330 回答
1

我遇到了这个问题,这是谷歌上的第一个答案。

如果您使用的是 rebar3,标准配置将有一个shell命令编译您的项目并打开一个 shell:

$ rebar3 shell
===> Analyzing applications...
===> Compiling myapp
Erlang/OTP 21 [erts-10.2.4] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1]

Eshell V10.2.4  (abort with ^G)
1> ===> Booted myapp
于 2020-10-22T23:48:21.877 回答