发布 | 10. Releases

10 发布

这部分是与被读取rel(4)systools(3)以及script(4)在SASL手册页。

10.1发布概念

当您编写一个或多个应用程序时,您可能需要使用这些应用程序和Erlang/OTP应用程序的一个子集创建一个完整的系统。这被称为发布

为此,请创建一个release resource file用于定义发行版中包含哪些应用程序的程序。

释放资源文件用于生成boot scriptsrelease packages。转移到并安装在另一个站点的系统称为目标系统系统原则“中介绍了如何使用发行包创建目标系统

10.2 释放资源文件

要定义一个版本,请创建一个版本资源文件,或简称为.rel文件。在文件中,指定版本的名称和版本,它基于哪个ERTS版本以及它由哪些应用程序组成:

{release, {Name,Vsn}, {erts, EVsn}, [{Application1, AppVsn1}, ... {ApplicationN, AppVsnN}]}.

NameVsnEVsn,和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文件还必须包含kernelstdlibsasl,因为这些应用程序是必需的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目录是让每个支持的客户端节点的一个子目录。每个客户端目录的名称将作为相应客户端节点的名称。至少,每个客户端目录将包含binreleases子目录。这些目录用于存储有关已安装版本的信息,并将当前版本指定给客户端。在$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 ...

有了这个结构,Type1is的客户端的根目录$ROOT/clients/Type1