非常教程

Erlang 20参考手册

指南:设计原则 | Guide: Design principles

发布 | 10. Releases

这部分是与被读取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

Erlang 20

Erlang 是一种通用的面向并发的编程语言,可应付大规模开发活动的程序设计语言和运行环境。

主页 https://www.erlang.org/
源码 https://github.com/erlang/otp
版本 20
发布版本 20.1