среда, февраля 26, 2014

relx + erlang.mk, релизы в Erlang для самых маленьких, шпаргалка.

Когда я начинал знакомство с эрлангом - с релизами у меня сразу не сложилось.
Раз конфиг, два конфиг, прорва нюансов, не самая понятная документация.
Решил что мне и без них живётся неплохо.

А тут вдруг попалось мне чудесное сочетание erlang.mk авторства Loïc Hoguin и relx от Erlware.

И с ними вдруг оказалось что создать релиз - дело пяти минут.
Конспект-шпаргалка с самого нуля:

1. Создаём папку
mkdir tst
cd tst

2. Скачиваем erlang.mk

wget https://raw.github.com/extend/erlang.mk/master/erlang.mk

3. Создаём каркас приложения

make -f erlang.mk bootstrap
make -f erlang.mk bootstrap-rel
(подробности см. в readme репозитория erlang.mk)

4. Смотрим в файл Makefile

Он содержит в себе необходимый минимум:

PROJECT=tst
include erlang.mk

5. Проверяем:
make

 ERLC   tst_sup.erl tst_app.erl
 APP    tst.app.src
.....

Отлично, всё компилируется.

6. Добавим в Makefile каких-нибудь зависимостей, просто чтоб показать как это делается:

PROJECT = tst
DEPS=mongodb gproc

dep_mongodb = git https://github.com/comtihon/mongodb-erlang.git HEAD
include erlang.mk

обращаем внимание: про часть библиотек erlang.mk "знает". Например, gproc. Подробности опять же в readme. А те, про которые он не разумеет - необходимо добавлять руками, пример одного из способов - выше.

7. проверяем:

make

Видим как все зависимости скачались и скомпилировались вместе с нашим приложением

8. по отдельности:

make clean
make deps
make app

Всё работает!

9. [много вырезано] Все шаги которые тут были ранее, по скачиванию и настройке relx, ныне делает сам erlang.mk

10. Добавляем приложения, от которых мы зависим в список applications файла src/tst.app.src. Тогда они будут запущены при старте автоматически.Получаем в итоге:
{application, tst,
 [
  {description, ""},
  {vsn, "0.0.1"},
  {registered, []},
  {applications, [
                  kernel,
                  stdlib,
                  gproc,
                 ]},
  {mod, { tst_app, []}},
  {modules, [ tst_app, tst_sup ]},
  {env, []}
 ]}.

11. А вот и всё. Если мы запускали make -f erlang.mk bootstrap-rel, то релиз у нас уже собирается автоматически и результат лежит в папке _rel

12. Проверяем созданный релиз:

cd _rel/tst_release
ls

bin  erts-6.0  lib  releases

Запускаем:

bin/tst_release console - запустить вместе с erlang shell, наглядно

bin/tst_release start - запустить демоном.

bin/tst_release stop
bin/tst_release restart
значение достаточно очевидно :)

bin/tst_release attach - запустить шелл и прицепиться к запущенному в фоне процессу.

остальные параметры можно посмотреть просто запустив bin/tst_release (а ещё лучше - просто прочитав исходник)

Вот собственно и всё, вот он - готовый рабочий релиз :)
Логи лежат в папке log, можно их поглядеть например командой
tail -f log/erlang.log.1

13. Ещё чуточку добавлю.
Довольно важная опция в relx.config - можно добавить {include_erts, "/path/to/alternate/erlang"} или {include_erts, false}.
Тогда runtime system не будет добавлена в релиз, а это значит две вещи:
а) на машине куда будет поставлен релиз необходимо наличие установленного эрланга
б) нам будет всё равно какая архитектура на целевой машине
Если включать erts, то целевая машина должна быть той же архитектуры как и та на которой собран релиз.

Кажется, всё?

(проверено и приведено к актуальному виду 14 декабря 2014 года)

Отправить комментарий