【问题标题】:How to run erlang (rebar build) application如何运行 erlang (rebar build) 应用程序
【发布时间】:2013-05-16 13:27:00
【问题描述】:

我是 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)..”,仅此而已。但我也希望看到“Starting app..

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

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

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

谢谢!

【问题讨论】:

    标签: erlang rebar


    【解决方案1】:

    为了快速开发,如果你只是想确保你的应用程序可以启动,启动一个 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
    

    【讨论】:

    • 感谢您的解释!最后,我弄清楚了它是如何协同工作的。
    • 这是可靠的建议。 rebar3 的语义似乎发生了一些变化。文档很棒 (rebar3.org/docs/releases)。具体检查 {dev_mode, true}。
    【解决方案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。如果您需要更多流程,只需将更多子规范添加到列表中即可。

    【讨论】:

    • 谢谢@legoscia。我检查了我的 app.src 文件和 mod 在那里 {application, dummys, [ {description, "dummy application"}, {vsn, "1"}, {registered, []}, {applications, [ kernel, stdlib ]}, {mod, { dummys_app, []}}, {env, []} ]}.
    【解决方案3】:
    erl -noshell -pa ebin -s application start dummys
    

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

    详情可以参考Erlang documentation

    对于你的情况,

    erl -noshell -pa ebin -s dummys
    

    【讨论】:

      【解决方案4】:

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

      如果你使用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
      

      【讨论】:

        猜你喜欢
        • 2012-12-14
        • 1970-01-01
        • 2013-03-02
        • 2012-12-14
        • 2014-04-01
        • 2012-10-30
        • 2014-01-07
        • 2013-03-15
        • 2012-05-05
        相关资源
        最近更新 更多