【问题标题】:cannot start empty OTP application from command line无法从命令行启动空的 OTP 应用程序
【发布时间】:2013-09-15 17:10:54
【问题描述】:

我已经创建了一个带有 rebar 的 OTP 应用程序框架:

$ rebar create-app appid=test

然后我用rebar compile编译它,当我运行时

$ erl -pa ebin -s test

我收到此错误

{"init terminating in do_boot",{undef,[{test,start,[],[]},{init,start_it,1,[]},{init,start_em,1,[]}]}}

但如果我从 shell 中调用 start,它就可以工作:

$ erl -pa ebin

Erlang R15B01 (erts-5.9.1) [source] [smp:2:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.1  (abort with ^G)
1> application:start(test).
ok

如何从操作系统命令行启动应用程序?

编辑:

我认为我需要跑步

$ erl -pa ebin -s application start test

现在我没有收到任何错误,但应用程序仍未启动...

【问题讨论】:

    标签: erlang


    【解决方案1】:

    erl -pa ebin/ -eval "application:start(test)"

    由于test_app.erl 中的start 函数的元数为2,因此无法直接使用erl 开关-s(或-run)调用它,因此只能调用元数0 或1那些开关(见http://erlang.org/doc/man/erl.html)。

    您可以添加一个包装函数,该函数依次调用start/2,但我认为-eval 更优雅。

    【讨论】:

    • 我也认为使用-eval 标志更优雅:)
    【解决方案2】:

    当出现一个或多个参数时,-s 标志假定一个参数列表。所以$ erl -pa ebin -s application start test 会做的是调用application:start([test]) 这不会按预期工作。

    这是一种解决方法(可能不是最佳解决方案):

    创建一个源文件src/test_init.erl,内容如下:

    -module(test_init).
    
    -compile(export_all).
    
    init() ->
        application:start(test).
    

    然后:

    $ rebar compile
    $ erl -pa ebin -s test_init init
    

    现在test 应用程序应该正在运行:)

    【讨论】:

      猜你喜欢
      • 2015-09-14
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      相关资源
      最近更新 更多