#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}
(хотя код все еще загружается).