本章应该与 rel(4) , systools(3) 和 script(4) 。html
当咱们已经写了一个或多个应用后,咱们可能想建立一个由这些应用和Erlang/OTP应用的一个子集组成的完整系统。node
要实现这个目的,咱们经过建立一个定义在发布中要包含哪些应用的 发布资源文件 。shell
该发布资源文件是用于生成 启动脚本 和 发布包 。传送并安装在另一个站点的系统称之为 目标系统 。若是使用发布包建立一个目标系统将在系统原则中描述。app
要定义一个发布,首先要建立一个 发布资源文件 ,简称 .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
:rest
{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_re-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
文件做为输入,并建立一个包含了指定应用的压缩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二进制文件。
如何使用发布包安装首个目标系统,请参考系统原理。若是在已存在系统的安装新的发布包,请参考 发布处理 。
发布处理器从发布包总安装的代码的目录结构:
$ROOT/lib/App1-AVsn1/ebin /priv /App2-AVsn2/ebin /priv ... /AppN-AVsnN/ebin /priv /erts-EVsn/bin /releases/Vsn /bin
lib
erts-EVsn/bin
releases/Vsn
.rel
文件以及启动脚本
start.boot
。 还有
relup
、
sys.config
,若是存在于发布包中。
bin
应用不必定非得放在 $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
是做为调用 systools:make_script/2
函数中的变量引入的。
若是一个完整的系统包含一些无盘和只读客户端节点,那么必须在 $ROOT
目录中添加一个 clients
目录。一个只读节点的意思是一个节点的文件系统是只读的。
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
。