запуск erlang с аргументами командной строки работает, с args_file нет

Я создал очень простое маленькое OTP-приложение на erlang, следуя замечательному «Как создать HTTP API с Erlang за 10 минут»:

https://vimeo.com/59832641

Он отлично работает, когда я запускаю erl с аргументами командной строки, как показано в видео. Однако, если я попытаюсь запустить erl с аргументом -args_file, приложение не запустится.

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>.


person nerophon    schedule 05.03.2013    source источник


Ответы (1)


Используйте флаг -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. В результате некоторые модули не находятся в вашем пути к коду, и поэтому приложение не запускается.

person Abhinav Singh    schedule 05.03.2013
comment
Вау, он не анализирует *, потому что он не находится непосредственно в командной строке. Спасибо! - person nerophon; 06.03.2013