Могу ли я использовать существующее приложение OTP внутри другого приложения или модуля?
Я строю систему, которая должна использовать ранее построенное приложение OTP (давайте назовем это X). Если я хочу создать новое приложение / модуль OTP, как я могу использовать приложение, например, уже существующее из модуля?
Я предполагал, что смогу позвонить start
поскольку оно следует application
поведение, и поэтому я создал минималистичное приложение Y, которое имеет следующий код:
y.erl:
-module(y).
-behaviour(application).
start(_StartType, _StartArgs) ->
io:format("going to call x_app~n"),
{ok, _} = x_app:start([]),
io:format("called x_app~n"),
y:start_link().
stop(_State) ->
ok = x_app:stop([]),
ok.
Арматура успешно компилирует этот код и не генерирует предупреждений.rel/y/bin/y start
ничего не выводит вообще (я надеялся получить вывод хотя бы одного io:format
)rel/y/bin/y stop
выходы Node is not running!
1 ответ
Вам необходимо перечислить приложение x
как зависимое приложение в вашем приложении .app
файл ресурсов, или так как вы используетеrebar
, в вашем.app.src
файл:
{application, your_app,
[{description,"your application"},
{vsn, "0.1"},
{modules,[]},
{registered, []},
{mod,{your_app,[]}},
{env, []},
{applications,[kernel, stdlib, x]}]}.
Обратите внимание, что в самой последней строке x
указан как зависимость приложения. Это приводит к тому, что контроллер приложений Erlang гарантирует, чтоx
запускается до запуска вашего приложения. И если вы запускаете приложение в интерактивном режиме в оболочке Erlang черезapplication:ensure_all_started/1,2
эта декларация гарантирует, что x
запускается первым до запуска вашего приложения.