2013-06-01 3 views
0

У меня есть простая команда Erlang, которую я хочу вызвать через erl -eval (для компиляции шаблона erlydtl, как описано в erlydtl page).Erlang: вызов erl -eval из командной строки никогда не выходит

Когда я делаю это в интерактивном режиме из оболочки все работает нормально, а команда выходит сразу:

erl -pa ebin deps\erlydtl\ebin Eshell V5.9.3.1 (abort with ^G) 
1> erlydtl:compile('templates/tictactoe.dtl',tictactoe_dtl,[{out_dir,'ebin'}]). 
ok 

Но когда я пытаюсь сделать это с помощью erl -eval (я хочу, чтобы запустить это из BAT-файла):

Затем команда выполняет свою работу (шаблон скомпилирован), но он не завершается, и мне нужно убить процесс оболочки вручную ctrl + c (я работаю под Windows).

Мне просто нужна команда для компиляции шаблона и выхода. В чем может быть проблема?

Обновление:

Одним из решений может быть добавление выхода() вызов в конце команды, но потом в итоге следующим образом:

erl -pa ebin deps\erlydtl\ebin -noshell -eval erlydtl:compile('templates/tictactoe.dtl',tictactoe_dtl,[{out_dir,'ebin'}]),exit(success). 
{"init terminating in do_boot",success} 

Crash dump was written to: erl_crash.dump 
init terminating in do_boot (success) 

Сообщение об ошибке очень раздражает, поэтому Мне все еще не нравится это решение.

+0

В качестве альтернативы вы можете построить свой проект с арматурой. Он поддерживает компиляцию шаблона Erlydtl при установке в директорию /templates. –

+0

В настоящее время я использую арматуру, но ищу альтернативу, потому что сборщик арматуры работает очень долго. –

+0

Является ли 'rebar compile skip_deps = true' также медленным для вас? –

ответ

5

Это должно сделать трюк

erl -noshell -eval 'c:ls()' -eval 'init:stop()' 

Вы должны сказать виртуальную машину, чтобы закрыть.

+0

Теперь он отлично работает! Спасибо за ответ, Ян, и за объяснение, почему halt() - неправильное решение. –

-1

вам нужно указать -noshell и вызвать halt() в конце. Например,

erl -noshell -eval "erlydtl:compile('templates/tictactoe.dtl',tictactoe_dtl,[{out_dir,'ebin'}]),halt()." 
+1

В целом я бы посоветовал использовать остановку, так как это сводило вас к минимуму. Предпочтительным способом является прекращение BEAM, вызвав init: stop/0, поскольку это позволяет любую очистку, необходимую приложениям. В этом случае это приведет к тому, что все выполнение будет немного медленнее, но с использованием erlang: halt/0, поскольку первый порт вызова является плохой привычкой. Я видел, что другие опытные программисты Erlang тратят часы на отладку просто потому, что у них есть привычка использовать erlang: halt/0. –