我是Erlang世界的新手,目前无法弄清楚如何启动我的虚拟erlang应用程序。可能,我只是遗漏了一些东西......所以,我用rebar创建了一个应用程序(rebar create-app appid = dummys)。
目前我有
我发现为了在开发期间运行应用程序,最好创建一个应该调用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
它只输出“正在启动app(dev).. ”,这就是全部。但我也希望看到“正在开始使用.. ”
我错过了什么或做错了什么?
=============
另一个问题:如何正确地向我的虚拟应用程序添加新模块?例如,我有一个名为“* dummys_cool *”的附加模块,它具有“ start ”方法。如何告诉我的应用程序运行“dummys_cool #start”方法?
谢谢!
答案 0 :(得分:13)
为了快速开发,如果您只是想确保您的应用程序可以启动,请启动一个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
答案 1 :(得分:2)
查看您的dummys.app.src
文件。 the 'app' manpage中解释了所有指令的含义,但我怀疑这里缺少的是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]}]}.
这在the 'supervisor' manpage中有描述,但基本上这意味着在启动时,该主管将启动一个子进程。将调用dummys_cool:start_link()
,并且该函数应生成一个新进程,链接到它,并返回其进程ID。如果您需要更多流程,只需在列表中添加更多子规范。
答案 2 :(得分:1)
erl -noshell -pa ebin -s application start dummys
上面的代码无效,因为application:start([dummys])
会被调用。
您可以参考Erlang documentation了解详情。
对于您的情况,
erl -noshell -pa ebin -s dummys
答案 3 :(得分:1)
我遇到了这个问题,这是Google的第一个答案。
如果您使用的是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