1

我按照惊人的“如何在 10 分钟内使用 Erlang 创建 HTTP API”在 erlang 中构建了一个非常简单的小 OTP 应用程序:

https://vimeo.com/59832641

当我使用命令行参数启动 erl 时,它可以完美运行,如视频中所示。但是,如果我尝试使用 -args_file 参数启动 erl,则应用程序不会启动。

args_file 非常简单;它只有一行,如下:

-pa deps/*/ebin ebin -s fancyapi_app

...这是我尝试运行 erlang 时收到的错误报告:

=INFO REPORT==== 5-Mar-2013::19:32:59 ===
application: fancyapi
exited: {shutdown,{fancyapi_app,start,[normal,[]]}}
type: temporary

有任何想法吗?是否args_file FileName会导致比仅使用常规命令行参数更多的事情发生?文档位于:

http://www.erlang.org/doc/man/erl.html

此外,我知道该命令在一定程度上是有效的,因为如果我添加-sname node到文本文件中,erl 提示符会显示(node@localhost)1>.

4

1 回答 1

4

使用-emu_args将显示发送到模拟器的确切参数的标志。这是一个简单的示例:

$ cat test.args 
-emu_args
-pa deps/*/ebin
-pa ebin
-name test@localhost

现在我将手动传递所有这些参数:

$ erl -emu_args -pa deps/*/ebin -pa ebin -name test@localhost
Executing: /Users/abhinavsingh/Builds/R15B03/lib/erlang/erts-5.9.3.1/bin/beam.smp /Users/abhinavsingh/Builds/R15B03/lib/erlang/erts-5.9.3.1/bin/beam.smp -- -root /Users/abhinavsingh/Builds/R15B03/lib/erlang -progname erl -- -home /Users/abhinavsingh -- -pa deps/cowboy/ebin deps/jsx/ebin deps/lager/ebin deps/mimetypes/ebin deps/ranch/ebin -pa ebin -name test@localhost

Erlang R15B03 (erts-5.9.3.1) [source] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.3.1  (abort with ^G)
(test@localhost)1> 

接下来通过 args 文件:

$ erl -args_file test.args 
Executing: /Users/abhinavsingh/Builds/R15B03/lib/erlang/erts-5.9.3.1/bin/beam.smp /Users/abhinavsingh/Builds/R15B03/lib/erlang/erts-5.9.3.1/bin/beam.smp -- -root /Users/abhinavsingh/Builds/R15B03/lib/erlang -progname erl -- -home /Users/abhinavsingh -- -pa deps/*/ebin -pa ebin -name test@localhost

Erlang R15B03 (erts-5.9.3.1) [source] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.3.1  (abort with ^G)
(test@localhost)1> 

如您所见,两者实际上并不相同。具体来说,虽然所有这些都手动-pa deps/*/ebin扩展为-pa deps/cowboy/ebin deps/jsx/ebin ...,但是当您通过 args 文件传递​​它时,同样的情况不会很好。结果,某些模块不在您的代码路径中,因此应用程序无法启动。

于 2013-03-05T21:26:02.253 回答