10.发布

本章应该与 rel(4) , systools(3) 和 script(4) 。

发布的概念

当我们已经写了一个或多个应用后,我们可能想创建一个由这些应用和Erlang/OTP应用的一个子集组成的完整系统。

要实现这个目的,我们通过创建一个定义在发布中要包含哪些应用的 发布资源文件 。

该发布资源文件是用于生成 启动脚本 和 发布包 。传送并安装在另外一个站点的系统称之为 目标系统 。如果使用发布包创建一个目标系统将在系统原则中描述。

发布资源文件

要定义一个发布,首先要创建一个 发布资源文件 ,简称 .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_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: [email protected]

...
=PROGRESS REPORT==== 13-Jun-2003::12:01:15 ===
         application: ch_app
          started_at: [email protected]

创建一个发布包

函数 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
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 是作为调用 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 。

时间: 2024-08-26 22:22:54

10.发布的相关文章

CrossApp alpha 0.1.10 发布,跨平台移动应用开发引擎

CrossApp alpha 0.1.10 更新内容: 1.CAImageView优化 优化CAImageView,并修改之前在CAImageView添加子视图显示不正确的bug,现在可随意添加子视图给CAImageView. 2.删除ccColor3B,并添加CAColor4B 删除之前的ccColor3B,以前所有用到ccColor3B的地方统统被CAColor4B替换,增加透明度属性. (介于此改动对之前已经基于本引擎的项目带来无法编译的问题,请大家谅解,在这里向大家说声抱歉) 3.删除O

OrientDB 2.2.10 发布,文档数据库

OrientDB 2.2.10 发布了,Orient DB 是一个可伸缩的文档数据库(入门教程qkxue.net),支持 ACID 事务处理. 更新内容: HA: allow overriding OLocalClusterStrategy java.lang.IllegalArgumentException: Cluster segment #-2 does not exist in databaseJDBC: null values(腾云科技ty300.com)Automatic backu

seci-log 1.10 发布 增加了全文搜索密码加密等多个功能点

日志分析软件 seci-log 1.10发布,增加了全文搜索密码加密等多个功能点.上篇文章http://www.oschina.net/news/64015/seci-log-1-09,有兴趣可以了解一下. 1.修改了windows2003 扫描资产的错误. 2.增加了密码加密功能,对邮件,远程机器访问的秘密进行加密,会更安全一些. 3.增加了资产统计报表 4.完善了整体报告,增加了告警主机排行和告警类型排行. 5.增加了登录统计报表 6.整合了全文搜索.这样就可以去掉了Kibana,虽然我们的

Rust 1.10 发布

2016年7月7日 Rust 1.10 发布. https://blog.rust-lang.org/2016/07/07/Rust-1.10.html

Java 10 发布,是时候关注 Kotlin 了

Java 10 发布了,对于广大程序员来说,算是个大新闻.毕竟在程序员的世界里,Java 仍然保持了一哥的地位,也就是说,这个世界上使用 Java 语言编程的程序员可能是最多的.不过最近 Java 大版本更新的速度确实让老程序员们瞠目结舌.十八年前,也就是千禧年 2000,Sun 公司像神经病一样连续在 5 月份推出了 JKD1.3 和 1.4,按照现在的版本规则,也就是 Java 3 和 4.四年以后 Java 5 发布,那是 2004 年,这种发布节奏让程序员完全找不到节奏,以至于 Java

Ubuntu 19.10 发布 | 云原生生态周报 Vol. 24

作者 | 木苏.进超.冬岛.元毅.心水.衷源 业界要闻 1.云原生编程语言 Pulumi 1.0 pulumi ,一款中立的开源云开发平台,Pulumi 支持多语言.混合云环境.完全可扩展.初期支持 JavaScript.TypeScript.Python 和 Go 语言,支持 AWS.Azure.GCP 云平台,另外还支持所有兼容 Kubernetes 的公有云.私有云和混合云.Pulumi 实现了一种单一.一致的编程模型,一组编程工具,可管理所有以上环境,丰富的生态系统支持大量可复用的包.1

Windows 10 发布:微软的回归与前进

“我们希望,所有Windows 7用户都能有这样的感觉:昨天他们还开着第一代普锐斯,而今天Windows 10就将让他们觉得像是开上了特斯拉.” 今天凌晨,微软发布了新一代操作系统 Windows 10,有趣的是,上一版的名称是 Windows 8,也就是说,实际上微软是跳过了 Windows 9.虽然从系统命名来看,似乎这个新系统发布是一次大跃进,但是从界面来讲,却是一次回归.香格里拉娱乐城 值得注意的是,从4英寸屏幕的“迷你”手机到10英寸的普通平板以及14英寸的笔记本.再到80英寸的巨屏电

Windows 9没有了,Windows 10发布了

在昨晚美国旧金山召开的 Windows 发布会上,微软宣布了下一代 Windows 名称为Windows 10. 标志着微软新一代 Windows 10 时代的开始,目前还只是宣布专注于企业和专业用户的功能,尤其是笔记本和桌面电脑的设备. Windows 10 技术预览版预计明天开始提供下载. Windows 10 将驱动小尺寸的如可穿戴设备.手机.平板,到笔记本.桌面电脑.Xbox One,以及更大屏幕的设备. 2015年初,微软将透露更多设备类型(比如手机.平板)上的 Windows 10,

恩布企业 IM 安卓端 1.2,服务端 1.10 发布

恩布企业IM,免费企业即时通讯,企业内部通讯平台,Android安卓开源手机客户端EntboostIM发布1.2版本,同时服务更新至1.10版本; 安卓端主要更新内容: 增加漫游消息的功能 修改当程序处于后台运行时,有些消息没有系统通知的问题 修复与离线游客会话时抛出异常的问题 优化我的消息,将只需要提示的一些群消息分离出来,单独区分为系统通知 解决系统通知时,表情显示不正常的问题,将显示表情的描述文字 优化网络异常后重新登录的问题 新增添加增加个人群组管理功能,包括创建个人群组和讨论组:邀请人