如何运行erlang(钢筋构建)应用程序

如何运行erlang(钢筋构建)应用程序,erlang,rebar,Erlang,Rebar,我是Erlang world的新手,目前还不知道如何启动我的虚拟Erlang应用程序。也许,我只是错过了一些东西。。。因此,我使用钢筋创建了一个应用程序(钢筋创建应用程序appid=dummys) 目前我有 rebar.config src/dummys.app.src src/dummys_app.erl src/dummys_sup.erl 我发现,为了在开发过程中运行应用程序,最好创建一个额外的start方法,该方法应该调用application:start(module) 我在sta

我是Erlang world的新手,目前还不知道如何启动我的虚拟Erlang应用程序。也许,我只是错过了一些东西。。。因此,我使用钢筋创建了一个应用程序(钢筋创建应用程序appid=dummys)

目前我有

  • rebar.config
  • src/dummys.app.src
  • src/dummys_app.erl
  • src/dummys_sup.erl
我发现,为了在开发过程中运行应用程序,最好创建一个额外的start方法,该方法应该调用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 -noshell -pa ebin -s dummys_app start
没有输出

如果我尝试

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 -noshell -pa ebin -s dummys_app start
erl因错误而崩溃

如果我尝试

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 -noshell -pa ebin -s dummys_app start
它只输出“启动应用程序(dev)”,仅此而已。但我也希望看到“启动应用程序..

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

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

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


谢谢大家!

查看您的
dummys.app.src
文件。中解释了所有指令的含义,但我怀疑此处缺少的是
mod
,它指示应用程序回调模块的名称。因此,请确保该行存在:

{mod, {dummys_app, []}}
其中的空列表将作为
StartArgs
参数传递给
dummys\u app:start/2


要使新模块随应用程序一起启动,请将其添加到
dummys\u sup:init
中的监控树中。此函数应类似于:

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

这在中进行了描述,但基本上这意味着在启动时,该主管将启动一个子进程
dummys\u cool:start\u link()
将被调用,该函数将生成一个新进程,链接到该进程,并返回其进程id。如果需要更多进程,只需向列表中添加更多子规范。

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

erl -pa ebin
1> dummys_app:start().
rel/dummys/bin/dummys start
rel/dummys/bin/dummys stop
rel/dummys/bin/dummys start
rel/dummys/bin/dummys attach
这将给你一个清晰的指示,什么是错的,什么是对的,没有炮弹轰炸后

因为您要让应用程序运行,而不仅仅是让库共享,所以您需要发布一个版本。钢筋可以为您提供大部分帮助:

mkdir rel
cd rel
rebar create-node nodeid=dummysnode
编译应用程序后,可以创建一个版本:

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

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

erl -pa ebin
1> dummys_app:start().
rel/dummys/bin/dummys start
rel/dummys/bin/dummys stop
rel/dummys/bin/dummys start
rel/dummys/bin/dummys attach
上面的代码将不起作用,因为将调用
application:start([dummys])

有关详细信息,请参阅

对于你的情况

erl -noshell -pa ebin -s dummys

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

如果您使用的是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

谢谢你@legoscia。我已经检查了我的app.src文件,mod是
{application,dummys,[{description,“dummy application”},{vsn,1},{registed,[]},{applications,[kernel,stdlib]},{mod mod,{dummys_app,[]},{env,[]}。
谢谢您的解释!最后,我明白了它是如何协同工作的。这是一个很好的建议。使用REBR3后,语义似乎发生了一些变化。文档很棒()。具体检查一下{dev_mode,true}。