Erlang: вызов erl -eval из командной строки никогда не завершается

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

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

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-файла):

erl -pa ebin deps\erlydtl\ebin -noshell -eval erlydtl:compile('templates/tictactoe.dtl',tictactoe_dtl,[{out_dir,'ebin'}])

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

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

Обновление:

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

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)

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


person Piotr Sobczyk    schedule 01.06.2013    source источник
comment
Кроме того, вы можете построить свой проект с помощью арматуры. Он поддерживает компиляцию шаблона Erlydtl при размещении в каталоге ‹project_root›/templates.   -  person Ward Bekker    schedule 01.06.2013
comment
В настоящее время я использую арматуру, но ищу альтернативу, потому что компиляция арматуры работает очень долго.   -  person Piotr Sobczyk    schedule 01.06.2013
comment
rebar compile skip_deps=true у вас тоже медленный?   -  person Ward Bekker    schedule 02.06.2013
comment
@WardBekker Спасибо за интерес, Уорд! Да, я знаю о skip_deps=true и использовал его. Но для завершения rebar compile skip_deps=true моего очень маленького игрушечного проекта требуется около 5 секунд, даже если ничего не изменилось с момента предыдущей сборки! И так как это игрушечный проект, мне нужно очень часто выполнять циклы компиляции-запуска. Компиляция с использованием erl -make у меня занимает менее 1 секунды, и перекомпилируются только отредактированные файлы, поэтому я решил переключиться на него и написать небольшой скрипт для компиляции шаблонов erlydtl. А вот и мы :-).   -  person Piotr Sobczyk    schedule 02.06.2013


Ответы (2)


Это должно помочь

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

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

person Jan Henry Nystrom    schedule 01.06.2013
comment
Теперь он работает отлично! Спасибо за ответ, Ян, и за объяснение, почему halt() является неправильным решением. - person Piotr Sobczyk; 04.06.2013

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

erl -noshell -eval "erlydtl:compile('templates/tictactoe.dtl',tictactoe_dtl,[{out_dir,'ebin'}]),halt()."
person Odobenus Rosmarus    schedule 01.06.2013
comment
В целом я бы посоветовал не использовать остановку, так как это равносильно сбою. Предпочтительным способом является завершение BEAM вызовом init:stop/0, так как это позволяет выполнять любую очистку, необходимую приложениям. В этом случае это немного замедлит все выполнение, но использование erlang:halt/0 в качестве первого порта захода — плохая привычка. Я видел опытных Erlang-программистов, которые тратили часы на отладку просто потому, что привыкли использовать erlang:halt/0. - person Jan Henry Nystrom; 02.06.2013