5 版本
5.1 OTP 版本
从 OTP 版本 17 开始,OTP 版本号对应于 OTP 版本的主版本部分。OTP 版本的概念是在 OTP 17 中引入的。使用的版本方案在 版本方案 中有详细描述。
特定版本的 OTP 是一个包含特定版本应用程序的集合。由 OTP 版本识别的应用程序版本对应于爱立信 AB 的 Erlang/OTP 团队一起测试过的应用程序版本。但是,OTP 系统可以与来自不同 OTP 版本的应用程序组合在一起。这种应用程序版本组合没有经过 Erlang/OTP 团队的测试。因此,**始终建议使用来自单个 OTP 版本的 OTP 应用程序**。
候选版本有一个 -rc<N> 后缀。后缀 -rc0 在开发过程中一直使用到第一个候选版本。
获取当前 OTP 版本
在 OTP 源代码树中,OTP 版本可以从文本文件 <OTP 源代码根目录>/OTP_VERSION 中读取。可以通过调用 filename:join([code:root_dir(), "OTP_VERSION"]) 来构建文件的绝对路径。
在已安装的 OTP 开发系统中,OTP 版本可以从文本文件 <OTP 安装根目录>/releases/<OTP 版本号>/OTP_VERSION 中读取。可以通过调用 filename:join([code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"]). 来构建文件的绝对路径。
如果从开发系统中的 OTP_VERSION 文件中读取的版本带有 ** 后缀,则该系统已使用 otp_patch_apply 工具打过补丁。在这种情况下,该系统由来自多个 OTP 版本的应用程序版本组成。** 后缀之前的版本对应于已打补丁的基础系统的 OTP 版本。请注意,如果开发系统通过 otp_patch_apply 以外的其他方式更新,则 OTP_VERSION 文件可能会识别出错误的 OTP 版本。
OTP 工具创建的 目标系统 中不会放置 OTP_VERSION 文件。这是因为很容易创建一个目标系统,即使很难确定基础 OTP 版本。但是,如果您知道 OTP 版本,可以在那里放置这样的文件。
OTP 版本表
文本文件 <OTP 源代码根目录>/otp_versions.table 是源代码的一部分,包含从 OTP 17.0 到当前 OTP 版本的所有 OTP 版本的信息。每行包含关于特定 OTP 版本中包含的应用程序版本的信息,格式如下
<OtpVersion> : <ChangedAppVersions> # <UnchangedAppVersions> :
<OtpVersion> 的格式为 OTP-<VSN>,与用于标识源代码的 git 标签相同。
<ChangedAppVersions> 和 <UnchangedAppVersions> 是应用程序版本的空格分隔列表,格式为 <应用程序>-<vsn>。
- <ChangedAppVersions> 对应于此 OTP 版本中版本号已更改的应用程序。
- <UnchangedAppVersions> 对应于此 OTP 版本中版本号未更改的应用程序。
两者都可能是空的,但不能同时为空。如果 <ChangedAppVersions> 为空,则没有更改导致任何应用程序的构建结果发生变化。例如,这可能仅仅是对构建系统的纯错误修复。行的顺序是未定义的。此文件中的所有空白字符都是空格(字符 32)或换行符(字符 10)。
使用普通 UNIX 工具(如 sed 和 grep),可以轻松找到各种问题的答案,例如
-
哪些 OTP 版本包含 kernel-3.0?
$ grep ' kernel-3\.0 ' otp_versions.table
-
在哪个 OTP 版本中引入了 kernel-3.0?
$ sed 's/#.*//;/ kernel-3\.0 /!d' otp_versions.table
以上命令提供的信息比精确的答案更多,但在手动搜索这些问题的答案时,这些信息已经足够了。
otp_versions.table 的格式可能会在 OTP 17 版本期间发生变化。
5.2 应用程序版本
从 OTP 17.0 开始,应用程序版本使用与 OTP 版本相同的 版本方案。但是,候选版本中的应用程序版本不会像 OTP 版本那样具有 -rc<N> 后缀。另请注意,应用程序版本中的主要增量不一定意味着 OTP 版本的主要增量。这取决于应用程序中的主要更改是否被视为对整个 OTP 的主要更改。
5.3 版本方案
从 OTP 17.0 开始,版本方案发生了改变。这意味着 OTP 17.0 之前使用的应用程序版本不符合此版本方案。OTP 17.0 中使用的应用程序版本列表 包含在本节的结尾部分。
在正常情况下,版本构造为 <Major>.<Minor>.<Patch>,其中 <Major> 是最重要的部分。
但是,可能存在比这更多的点分隔部分。点分隔部分由非负整数组成。如果所有小于 <Minor> 的部分都等于 0,则它们将被省略。三个正常部分 <Major>.<Minor>.<Patch> 更改如下
- <Major> - 当进行重大更改(包括不兼容性)时增加。
- <Minor> - 当添加新功能时增加。
- <Patch> - 当进行纯错误修复时增加。
当版本号中的某一部分增加时,所有小于该部分的部分都将设置为 0。
应用程序版本或 OTP 版本标识源代码版本。也就是说,它不暗示应用程序或 OTP 是如何构建的。
版本的顺序
通常,版本号只是部分排序的。但是,从 OTP 17.0 开始,正常版本号(具有三个部分)具有总顺序或线性顺序。这适用于普通 OTP 版本和普通应用程序版本。
比较两个具有顺序的版本号时,从最重要的部分到最不重要的部分,将每个部分作为普通整数进行比较。顺序由第一个具有不同重要性的部分定义。具有较大版本号的 OTP 版本包含所有包含在较小 OTP 版本中的更改。应用程序版本也是如此。
一般来说,版本可以包含三个以上的部分。然后,这些版本只是部分排序的。此类版本仅在从另一个分支中分离出来时使用。当向版本号添加额外的部分(超出正常的三个部分)时,将创建一个新的版本分支。新分支相对于基础版本具有线性顺序。但是,不同分支上的版本没有顺序,因此只能得出结论,它们都包含其最近公共祖先中包含的内容。从同一个基础版本多次分离时,在基础版本和最低位的 1 部分之间添加 0 部分,直到找到唯一的版本。具有顺序的版本可以按上一段中描述的方式进行比较。
分支版本的示例:版本 6.0.2.1 是从基础版本 6.0.2 分离出来的一个分支版本。版本形式 6.0.2.<X> 可以与小于或等于 6.0.2 的正常版本以及其他版本形式 6.0.2.<X> 进行比较。版本 6.0.2.1 将包含 6.0.2 中的所有更改。但是,6.0.3 很可能**不**包含 6.0.2.1 中的所有更改(请注意,这些版本没有顺序)。从基础版本 6.0.2 分离出来的第二个分支版本将是版本 6.0.2.0.1,第三个分支版本将是 6.0.2.0.0.1。
5.4 版本和补丁
当发布新的 OTP 版本时,它将具有形式为 <Major>.0 的 OTP 版本,其中主要 OTP 版本号等于版本号。主要版本号比最后一个主要版本增加了一步。所有其他具有相同主要 OTP 版本号的 OTP 版本都是该 OTP 版本的补丁。
补丁以维护补丁包或紧急补丁包的形式发布。唯一不同的是,维护补丁包是计划的,通常包含比紧急补丁包更多的更改。当发现这些问题时,会发布紧急补丁包来解决一个或多个特定问题。
发布维护补丁包通常意味着 OTP <Minor> 版本的增加,而发布紧急补丁包通常意味着 OTP <Patch> 版本的增加。然而,情况并非总是如此,因为 OTP 版本的更改是基于代码的实际更改,而不是基于补丁是计划的还是非计划的。有关更多信息,请参见上面的 版本方案 部分。
5.5 OTP 版本树
所有已发布的 OTP 版本都可以在 OTP 版本树 中找到,该版本树在我们发布新 OTP 版本时会自动更新。请注意,每个版本号本身都明确定义了它在版本树中的位置。构建版本树只需要版本号。版本树的根是 OTP 版本 17.0,这是我们引入新 版本方案 的时候。绿色版本是主干上发布的正常版本。旧的 OTP 版本 会在从主干分支出来的 maint 分支上维护一段时间。旧的 maint 分支总是在将下一个 OTP 版本引入主干时从主干分支出来。这些旧的 maint 分支上的版本用蓝色标记。除了绿色和蓝色版本,还有灰色版本。这些是在分支上引入的版本,用于针对特定客户在特定基本版本上修复特定问题。带有灰色版本的版本分支通常会很快变成死胡同,如果不是立即的话。
5.6 OTP 17.0 应用程序版本
以下列表详细说明了 OTP 17.0 中包含的应用程序版本。如果应用程序版本号的正常部分比列表中的对应应用程序版本小,则该版本号不符合 OTP 17.0 中引入的版本方案,应将其视为没有与 OTP 17.0 以后使用的版本进行排序的顺序。
- asn1-3.0
- common_test-1.8
- compiler-5.0
- cosEvent-2.1.15
- cosEventDomain-1.1.14
- cosFileTransfer-1.1.16
- cosNotification-1.1.21
- cosProperty-1.1.17
- cosTime-1.1.14
- cosTransactions-1.2.14
- crypto-3.3
- debugger-4.0
- dialyzer-2.7
- diameter-1.6
- edoc-0.7.13
- eldap-1.0.3
- erl_docgen-0.3.5
- erl_interface-3.7.16
- erts-6.0
- et-1.5
- eunit-2.2.7
- gs-1.5.16
- hipe-3.10.3
- ic-4.3.5
- inets-5.10
- jinterface-1.5.9
- kernel-3.0
- megaco-3.17.1
- mnesia-4.12
- observer-2.0
- odbc-2.10.20
- orber-3.6.27
- os_mon-2.2.15
- ose-1.0
- otp_mibs-1.0.9
- parsetools-2.0.11
- percept-0.8.9
- public_key-0.22
- reltool-0.6.5
- runtime_tools-1.8.14
- sasl-2.4
- snmp-4.25.1
- ssh-3.0.1
- ssl-5.3.4
- stdlib-2.0
- syntax_tools-1.6.14
- test_server-3.7
- tools-2.6.14
- typer-0.9.6
- webtool-0.8.10
- wx-1.2
- xmerl-1.3.7