Как запустить приложение 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