Erlang / Rebar3 — Как добавить приложение в релиз, но не запускать его?

#erlang #rebar #rebar3

#erlang #rebar #rebar3

Вопрос:

У меня есть общий проект, включающий в себя main_app, app1, app2. main_app может работать отдельно или может работать с app1 и app2 и управлять ими.

Решение о запуске app1 и app2 находится на внешней стороне (специальный конфигурационный файл, заполняемый пользователем).

Я использую rebar.config, его часть:

 {lib_dirs, ["apps"]}.
{sub_dirs, [
  "apps/main_app",
  "apps/app1",
  "apps/app2"
]}.

{relx, [{release, {main_app, "0.8.6"},
         [kernel,
          sasl,
          main_app]},
        {sys_config,  "./config/sys.config"},
        {vm_args,     "./config/vm.args"},
        {dev_mode, true},
        {include_src, true},
        {include_erts, false},
        {extended_start_script, true}]
}.

{profiles, [
  {prod, [
    {relx, [
      {dev_mode, false},
      {include_erts, false},
      {include_src, false},
      {sys_config,  "./config/prod_sys.config"},
      {vm_args,     "./config/prod_vm.args"}
    ]}
  ]}
]}.
  

Если я использую sudo rebar3 shell — я могу управлять app1 и app2.
Но если я упакую релиз с помощью sudo rebar3 as prod tar — я получаю архив tar, который не включает файлы beam app1 и app2.
Я знаю, что если я помещу app1 и app2 в раздел release в списке с kernel, sasl, main_app — мои необходимые приложения будут добавлены в release, но они будут запущены автоматически (мне нужно запустить самостоятельно)!

Как настроить rebar для добавления всех библиотек или приложений в выпуск tar, но не для их запуска при запуске main_app?

Заранее спасибо!

Ответ №1:

Используйте {app, load} синтаксис:

 {relx, [
    {release, { Project, Version }, [
        {app1, load}
...
  

Таким образом, приложение загружается, но не запускается. Если вы не хотите ни загружать, ни запускать приложение, используйте {app, none} (хотя код все еще загружается).