Как запустить приложение erlang (сборка арматуры)
Я новичок в мире Erlang и в настоящее время не могу понять, как запустить мое фиктивное приложение. Вероятно, я просто что-то упустил... Итак, я создал приложение с арматурой (арматурный create-app appid = dummys).
В настоящее время у меня
- rebar.config
- ЦСИ /dummys.app.src
- ЦСИ /dummys _app.erl
- ЦСИ /dummys _sup.erl
Я обнаружил, что для запуска приложения во время разработки лучше создать дополнительный метод запуска, который должен вызвать приложение: start (module).
Я добавил некоторые базовые записи в мои методы запуска.
start() ->
error_logger:info_msg("Starting app(dev)..~n"),
application:start(dummys_app).
start(_StartType, _StartArgs) ->
error_logger:info_msg("Starting app..~n"),
dummys_sup:start_link().
Если я попробую
erl -noshell -pa ebin -s application start dummys
erl -noshell -pa ebin -s application start dummys_app
нет выхода..
Если я попробую
erl -noshell -pa ebin -s dummys start
Ошибка erl с ошибкой.
Если я попробую
erl -noshell -pa ebin -s dummys_app start
выводится только " Запуск приложения (dev).." и все. Но я также ожидаю увидеть " Запуск приложения.."
Что мне не хватает или что-то не так?
=============
И еще один вопрос: Как правильно добавить новый модуль в мое фиктивное приложение? Например, у меня есть дополнительный модуль под названием "* dummys_cool *", который имеет метод "start". Как указать моему приложению запустить этот метод "dummys_cool # start"?
Спасибо!
Ответы
Ответ 1
Для быстрой разработки, если вы просто хотите, чтобы ваше приложение могло начать, запустите оболочку, затем запустите приложение:
erl -pa ebin
1> dummys_app:start().
Это даст вам четкое указание на то, что не так и правильно, без бомбардировки оболочки после.
Поскольку вы создаете приложение для запуска, а не только для общей библиотеки, вы захотите сделать выпуск. Арбалет может получить от вас большую часть пути:
mkdir rel
cd rel
rebar create-node nodeid=dummysnode
После того, как вы скомпилировали приложение, вы можете создать выпуск:
rebar generate
Это создаст переносную версию, которая включает в себя все необходимые библиотеки и даже систему исполнения erlang. Это по умолчанию помещается в каталог rel/; в вашем случае rel/dummys.
Внутри этого каталога появится элемент управления script, который можно использовать для запуска, остановки и присоединения к приложению:
rel/dummys/bin/dummys start
rel/dummys/bin/dummys stop
rel/dummys/bin/dummys start
rel/dummys/bin/dummys attach
Ответ 2
Посмотрите на свой dummys.app.src
файл. Смысл всех директив объясняется в справочной странице "app" , но я подозреваю, что здесь отсутствует mod
, что указывает на имя вашего обратного вызова вашего приложения. Поэтому убедитесь, что эта строка присутствует:
{mod, {dummys_app, []}}
Пустой список там будет передан как аргумент StartArgs
в dummys_app:start/2
.
Чтобы создать новый модуль вместе с вашим приложением, добавьте его в дерево наблюдения в dummys_sup:init
. Эта функция должна выглядеть примерно так:
init(_) ->
{ok, {{one_for_one, 10, 10},
[{dummys_cool, {dummys_cool, start_link, []},
permanent, brutal_kill, worker, [dummys_cool]}]}.
Это описано в справочной странице 'supervisor', но в основном это означает, что при запуске этот супервизор начнет один дочерний процесс. dummys_cool:start_link()
будет вызываться, и ожидается, что эта функция породит новый процесс, свяжется с ним и вернет свой идентификатор процесса. Если вам нужно больше процессов, просто добавьте в список дополнительные спецификации для детей.
Ответ 3
erl -noshell -pa ebin -s application start dummys
Приведенный выше код не будет работать, потому что будет вызываться application:start([dummys])
.
Подробнее см. документацию Erlang.
В вашем случае
erl -noshell -pa ebin -s dummys