Как скомпилировать приложение Erlang в исполняемый двоичный файл и запустить его? - PullRequest
5 голосов
/ 07 ноября 2010

Сейчас я изучаю Erlang, и у меня есть вопрос о том, как запускать и тестировать приложения Erlang.

У нас есть некоторые взгляды на запуск и тестирование программ Erlang:

  1. Мы можемзапустите оболочку Erlang и протестируйте там нашу функцию.
  2. Мы можем скомпилировать некоторые файлы с нашим кодом Erlang, чем создать файл .app, а затем снова запустить оболочку Erlang и вызвать application:start(AppName).

Мой вопрос: можем ли мы сделать двоичный исполняемый файл из кода Erlang, например, кода C?Как я могу запускать программы без оболочки Erlang таким образом, чтобы я мог запускать программу, вводить какую-то команду и после этого вызывать функции Erlang для этой команды?

Например, у меня есть модуль (test.erl) с тремяфункции:

foo1() -> ...

foo2() -> ...

foo3() -> ...

Затем я хочу запустить программу в терминале и ввести флаг -a для вызова функции foo1, -b флаг для foo2 и т. д.

Ответы [ 3 ]

7 голосов
/ 28 декабря 2015

Позвольте мне разделить ответ на три части:

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"]]}
4 голосов
/ 07 ноября 2010

Нет, вы не можете сделать двоичный файл.Вы можете написать bash- или скрипт для автоматического запуска кода запуска / тестирования.

1 голос
/ 09 ноября 2010

Вы также должны проверить eunit, который может автоматизировать большую часть работы автоматизированных модульных тестов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...