Могу ли я использовать существующее приложение 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 запускается первым до запуска вашего приложения.

Другие вопросы по тегам