发布 | 10. Releases
10 发布
这部分是与被读取rel(4)
,systools(3)
以及script(4)
在SASL手册页。
10.1发布概念
当您编写一个或多个应用程序时,您可能需要使用这些应用程序和Erlang/OTP应用程序的一个子集创建一个完整的系统。这被称为发布
。
为此,请创建一个release resource file
用于定义发行版中包含哪些应用程序的程序。
释放资源文件用于生成boot scripts
和release packages
。转移到并安装在另一个站点的系统
称为目标系统
。系统
原则“中介绍了如何使用发行包创建目标系统
。
10.2 释放资源文件
要定义一个版本,请创建一个版本资源文件
,或简称为.rel
文件。在文件中,指定版本的名称和版本,它基于哪个ERTS版本以及它由哪些应用程序组成:
{release, {Name,Vsn}, {erts, EVsn},
[{Application1, AppVsn1},
...
{ApplicationN, AppVsnN}]}.
Name
,Vsn
,EVsn
,和AppVsn
都是字符串。
该文件必须命名Rel.rel
,其中Rel
是唯一的名称。
每个Application
(atom)AppVsn
是发布中包含的应用程序的名称和版本。基于Erlang/OTP的最小版本由Kernel和STDLIB应用程序组成,因此这些应用程序必须包含在列表中。
如果要升级版本,则还必须包含SASL应用程序。
例如:
ch_app
from 的发布Applications
包含以下.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"}]
}.
10.3生成启动脚本
systools
在SASL应用程序中包含用于构建和检查版本的工具。这些函数读取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
10.4创建发布包
systools:make_tar/1,2
函数将一个.rel
文件作为输入并使用指定应用程序的代码(一个发行包)
创建一个压缩的tar文件:
1> systools:make_script("ch_rel-1").
ok
2> systools:make_tar("ch_rel-1").
ok
发行包默认包含:
.app
文件
.rel
文件
- 所有应用程序的目标代码,按照
application directory structure
- 二进制引导脚本重命名为
start.boot
% 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/A/ch_rel-1.rel
releases/ch_rel-1.rel
生成一个新的引导脚本,而不使用local
选项集,在发布包生成之前。在发布包中,所有应用程序目录都放在lib
您不知道将在哪里安装发行包,因此不允许硬编码绝对路径。
释放资源文件mysystem.rel
在tar文件中被复制。最初,该文件只存储在releases
目录中,以便可以release_handler
单独提取此文件。解压tar文件后,release_handler
会自动将文件复制到releases/FIRST
。但是,有时tar文件在不涉及release_handler
(例如,解包第一个目标系统时)的情况下解压缩,因此文件现在在tar文件中被复制,因此不需要手动复制。
如果找到relup
调用的文件和/或系统配置文件sys.config
,则这些文件也包含在发行包中。看Release Handling
。
可以设置选项以使发行包中包含源代码和ERTS二进制文件。
有关如何使用发行包安装第一个目标系统的信息,请参阅系统原则。有关如何在现有系统中安装新发行版软件包的信息,请参阅Release Handling
。
10.5目录结构
释放处理程序从发行包安装的代码的目录结构如下所示:
$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
在调用systools:make_script/2
函数时引入$SECOND_ROOT
和$THIRD_ROOT
当做variables
。
无盘(Disk-Less)和/或只读客户端
如果一个完整的系统由无磁盘和/或只读客户机节点组成,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
is的客户端的根目录$ROOT/clients/Type1
。