1

我用钢筋创建了一个 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,[]}]}}

但如果我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

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

4

2 回答 2

2

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

由于start函数 intest_app.erl具有 arity 2,因此无法直接使用erl开关-s(或-run)调用它,只有 arity 0 或 1 可以使用这些开关调用(请参阅http://erlang.org/doc/man/erl. html ).

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

于 2013-09-15T08:53:59.770 回答
2

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

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

创建一个src/test_init.erl包含以下内容的源文件:

-module(test_init).

-compile(export_all).

init() ->
    application:start(test).

然后:

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

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

于 2013-09-15T09:10:54.297 回答