OTP Releases
| Оригинал этой статьи находится по адресу Releases |
Автор: Mirrorer
Дата: 06.11.2006
Версия: 1.0
Эту главу следует читать вместе с документацией по rel(4), systools(3) и script(4).
Содержание |
Концепция релизов
Когда мы написали одно или несколько приложений, у нас может возникнуть желание создать систему, состоящую из этих приложений и некоторого подмножества приложений Erlang/OTP. Это называется релизом.
Для того чтобы сделать это, мы создаем файл ресурсов релиза, который определяет, какие приложения будут включены в релиз.
Файл ресурсов релиза необходим для генерации загрузочных скриптов и пакетов релиза. Система, которая передается и устанавливается в другом месте, называется целевой системой (target system). Как использовать пакеты для создания целевой системы, описано в разделе документации «Системные принципы».
Файл ресурсов релиза
Для описания релиза мы создаем файл ресурсов релиза (release resource file), или, более коротко, .rel файл, в котором мы задаем имя и версию релиза, на какой версии ERTS он создан и из каких приложений состоит:
{release, {Name,Vsn}, {erts, EVsn},
[{Application1, AppVsn1},
...
{ApplicationN, AppVsnN}]}.
Файл должен называться Rel.rel, где Rel – уникальное имя.
Name, Vsn и Evsn – строки.
Каждое приложение Application (атом) и AppVsn (строка) – это имя и версия приложения, включенного в релиз. Необходимо заметить, что минимальный релиз, созданный на основе Erlang/OTP, состоит из приложений kernel и stdlib, так что эти приложения обязательно должны быть включены в список.
Пример: Мы хотим создать релиз приложения ch_app из главы Приложения. Это приложение имеет следующий .app файл:
{application, ch_app,
[{description, "Channel allocator"},
{vsn, "1"},
{modules, [ch_app, ch_sup, ch3]},
{registered, [ch3]},
{applications, [kernel, stdlib, sasl]},
{mod, {ch_app,[]}}
]}.
Файл .rel также должен содержать kernel, stdlib и sasl, поскольку эти приложения используются ch_app. Назовем файл ch_rel-1.rel:
{release,
{"ch_rel", "A"},
{erts, "5.3"},
[{kernel, "2.9"},
{stdlib, "1.12"},
{sasl, "1.10"},
{ch_app, "1"}]
}.
Генерация загрузочных скриптов
В SASL модуле systools есть утилиты, позволяющие создавать и проверять релизы. Функции читают файлы .rel и .app и производят проверку синтаксиса и зависимостей. Функция systools:make_script/1,2 используется для генерации загрузочного скрипта (см. Системные принципы).
1> systools:make_script("ch_rel-1", [local]).
ok
Эта функция создаст загрузочный скрипт в пригодном для чтения виде (в файле ch_rel-1.script) и в бинарном виде, используемом системой выполнения (в файле ch_rel-1.boot). "ch_rel-1" – это имя .rel файла, за исключением расширения. local – это опция, обозначающая, что директории, в которых находятся приложения, будут использованы в загрузочном скрипте вместо $ROOT/lib. ($ROOT – это корневая директория установленного релиза.) Это полезный способ проверить сгенерированный загрузочный скрипт локально.
При запуске Erlang/OTP с использованием загрузочного скрипта все приложения из .rel файла будут автоматически загружены и запущены:
% erl -boot ch_rel-1
Erlang (BEAM) emulator version 5.3
Eshell V5.3 (abort with ^G)
1>
=PROGRESS REPORT==== 13-Jun-2003::12:01:15 ===
supervisor: {local,sasl_safe_sup}
started: [{pid,<0.33.0>},
{name,alarm_handler},
{mfa,{alarm_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
...
=PROGRESS REPORT==== 13-Jun-2003::12:01:15 ===
application: sasl
started_at: nonode@nohost
...
=PROGRESS REPORT==== 13-Jun-2003::12:01:15 ===
application: ch_app
started_at: nonode@nohost
Создание пакета релиза
Существует функция systools:make_tar/1,2, которая принимает .rel файл в качестве параметра и создает сжатый zip-ом tar-файл с кодом для указанных приложений – пакет релиза(release package).
1> systools:make_script("ch_rel-1").
ok
2> systools:make_tar("ch_rel-1").
ok
Пакет релиза по умолчанию состоит из .app файлов и объектного кода для всех приложений, находящихся в местах, определенных структурой директорий приложения, загрузочного скрипта в бинарном виде, переименованном в start.boot, и .rel файла.
% tar tf ch_rel-1.tar lib/kernel-2.9/ebin/kernel.app lib/kernel-2.9/ebin/application.beam ... lib/stdlib-1.12/ebin/stdlib.app lib/stdlib-1.12/ebin/beam_lib.beam ... lib/sasl-1.10/ebin/sasl.app lib/sasl-1.10/ebin/sasl.beam ... lib/ch_app-1/ebin/ch_app.app lib/ch_app-1/ebin/ch_app.beam lib/ch_app-1/ebin/ch_sup.beam lib/ch_app-1/ebin/ch3.beam releases/A/start.boot releases/ch_rel-1.rel
Необходимо заметить, что новый загрузочный скрипт был сгенерирован без опции local, перед созданием пакета релиза. В пакете релиза все директории приложения расположены в директории lib. Мы также не знаем, где будет установлен пакет релиза, поэтому мы не должны жестко задавать абсолютные пути в загрузочном скрипте.
Если файл relup и/или системный конфигурационный файл sys.config найдены, эти файлы также включаются в пакет релиза. Смотрите раздел Управление релизами.
Также можно установить опции для включения в пакет релиза исходных кодов и бинарников ERTS.
Для установки новой системы, используя пакет релиза, обратитесь к разделу Системные Принципы(System Principles), а для получения информации об установке нового пакета релиза на существующую систему – к разделу Управление релизами.
Структура директорий
Структура директорий для кода, установленного менеджером релизов из пакета релиза:
$ROOT/lib/App1-AVsn1/ebin
/priv
/App2-AVsn2/ebin
/priv
...
/AppN-AVsnN/ebin
/priv
/erts-EVsn/bin
/releases/Vsn
/bin
- lib – директории приложений.
- erts-EVsn/bin – исполняемые файлы системы Erlang.
- releases/Vsn – .rel файл и загрузочный скрипт start.boot, при наличии в пакете релиза relup и/или sys.config.
- bin – Высокоуровневые исполняемые файлы системы Erlang.
Приложения не обязательно должны находиться в директории $ROOT/lib. Соответственно, может существовать несколько установочных директорий, каждая из которых может содержать различные части системы. Например, предыдущий пример может быть расширен следующим образом:
$SECOND_ROOT/.../SApp1-SAVsn1/ebin
/priv
/SApp2-SAVsn2/ebin
/priv
...
/SAppN-SAVsnN/ebin
/priv
$THIRD_ROOT/TApp1-TAVsn1/ebin
/priv
/TApp2-TAVsn2/ebin
/priv
...
/TAppN-TAVsnN/ebin
/priv
$SECOND_ROOT и $THIRD_ROOT представлены как variables при вызове функции systools:make_script/2.
Бездисковые клиенты или клиенты в режиме «только чтение»
Если вся система состоит из нескольких бездисковых клиентов или клиентов в режиме «только чтение», директория clients должна быть добавлена в директорию $ROOT. Под узлом в режиме «только чтение» мы подразумеваем узел с файловой системой, доступной только для чтения.
Директория clients должна содержать по одной поддиректории на каждый поддерживаемый клиентский узел. Имя каждой клиентской директории должно совпадать с именем соответствующего клиентского узла. Как минимум, каждая клиентская директория должна содержать поддиректории bin и releases. Эти директории используются для сохранения информации об установленных релизах и для указания текущего релиза клиенту. Соответственно, директория $ROOT содержит следующие директории:
$ROOT/...
/clients/ClientName1/bin
/releases/Vsn
/ClientName2/bin
/releases/Vsn
...
/ClientNameN/bin
/releases/Vsn
Эта структура должна использоваться, если все клиенты запускаются на Erlang-машине одного и того же типа. Если есть клиенты, работающие на других типах Erlang-машин или на других операционных системах, директория clients должна быть разделена на несколько поддиректорий, по одной на каждый тип Erlang-машины. Также можно установить отдельную директорию $ROOT для каждого типа машины. Для каждого типа должны быть включены некоторые из директорий из $ROOT:
$ROOT/...
/clients/Type1/lib
/erts-EVsn
/bin
/ClientName1/bin
/releases/Vsn
/ClientName2/bin
/releases/Vsn
...
/ClientNameN/bin
/releases/Vsn
...
/TypeN/lib
/erts-EVsn
/bin
...
В этой структуре корневая директория для клиентов типа Type1 будет $ROOT/clients/Type1.

