Позвольте мне разделить ответ на три части:
1.Запуск приложений Erlang
Как исходный код Erlang (файлы .erl) скомпилирован в байт-код BEAM (файлы .beam), а затем запущен поверх виртуальной машины Erlang (BEAM), поэтому нет возможности создать отдельныйодин бинарный без необходимости виртуальной машины.Но существуют способы упаковки, сборки, переноса, обновления и запуска приложений Erlang на основе OTP, который является его формальной платформой.
A.Флаги командной строки
Представьте, что мы разработали приложение с именем foo
, теперь мы можем запустить его с помощью набора флагов, например:
$ erl \
-pa path/to/foo \
-s foo \
-sname foo_node \
-setcookie foo_secret \
-noshell -noinput > /path/to/foo.log &
- -pa добавляет указанный каталог к пути
- -s запускает приложение
foo
- -sname делает его распространенным скороткое имя
- -setcookie устанавливает cookie для создания минимального уровня безопасности
- -noshell запускает erlang без оболочки
- -noinput не позволяет читать входные данные из оболочки
Затем мы можем остановить его с помощью следующей команды:
$ erl \
-sname stop_foo_node \
-setcookie foo_secret \
-eval 'rpc:call(foo, foo_node, stop, []), init:stop()' \
-noshell -noinput > /path/to/foo.log &
- -eval вычисляет данные выражения
А также мы можем присоединиться к оболочке приложения foo с помощью этой команды:
$ erl \
-sname debug_foo_node \
-setcookie foo_secret \
-rmesh foo_node
- -rmesh делает удаленную оболочку для данного узла
Вы можете поместить вышеуказанные команды в скрипт make-файла или оболочки для их простого использования.Также для более детального контроля над процессом запуска системы мы можем использовать файл сценария загрузки и указать его с флагом -boot
.Загрузочный файл содержит инструкции о том, как запустить систему, от каких модулей и приложений мы зависим, а также содержит функции для перезапуска, перезагрузки и остановки системы.Процесс создания и использования загрузочного скрипта хорошо документирован на веб-сайте документации Erlang .
B.Инструмент релиза
Другой способ, который автоматизирует и интегрирует большинство работ для нас, - это reltool , который является стандартным и полнофункциональным инструментом управления релизами.Мы можем указать версию нашего приложения, загрузочный скрипт, зависимости и т. Д. В файле конфигурации reltool и создать переносимый выпуск.Это пример структуры приложения Erlang / OTP, совместимого с reltool:
├── deps
│ └── ibrowse
├── ebin
│ ├── foo.app
│ ├── foo_app.beam
│ └── foo_sup.beam
├── rebar.config
├── rel
│ ├── files
│ ├── foo
│ └── reltool.config
└── src
├── foo_app.erl
├── foo.app.src
└── foo_sup.erl
Мы можем использовать Rebar , который является инструментом сборки Erlang, чтобы сделать его еще проще для создания приложения Erlang итакже выпускает. Подробное руководство о том, как использовать Rebar для такой задачи.
2.Тестирование приложений Erlang
Для приложений Erlang есть две стандартные тестовые среды:
Eunit: это стандартная структура OTP для модульного тестирования, которая может тестировать функцию.модуль, процесс или даже приложение.
CommonTest: Это еще одна стандартная тестовая среда OTP, которая предоставляет структуры для определения локальных или распределенных тестовых сценариев и управляет запуском, регистрацией и отчетомрезультаты.
Общепринятой практикой является объединение их для тестирования как белого, так и черного ящиков.Также Rebar предоставляет команды rebar eunit
и rebar ct
для автоматизации их выполнения.
3.Передав аргумент командной строки
Используя init:get_argument/1
, мы можем получить пользовательские флаги, чтобы принять решение по ним следующим образом:
$ erl -foo foo1 foo2 -bar bar1
1> init:get_argument(foo).
{ok,[["foo1","foo2"]]}
2> init:get_argument(bar).
{ok,[["bar1"]]}