5  版本

5  版本

从 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_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_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 工具(如 sedgrep),可以轻松找到各种问题的答案,例如

  • 哪些 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 版本期间发生变化。

从 OTP 17.0 开始,应用程序版本使用与 OTP 版本相同的 版本方案。但是,候选版本中的应用程序版本不会像 OTP 版本那样具有 -rc<N> 后缀。另请注意,应用程序版本中的主要增量不一定意味着 OTP 版本的主要增量。这取决于应用程序中的主要更改是否被视为对整个 OTP 的主要更改。

注意

从 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

当发布新的 OTP 版本时,它将具有形式为 <Major>.0 的 OTP 版本,其中主要 OTP 版本号等于版本号。主要版本号比最后一个主要版本增加了一步。所有其他具有相同主要 OTP 版本号的 OTP 版本都是该 OTP 版本的补丁。

补丁以维护补丁包或紧急补丁包的形式发布。唯一不同的是,维护补丁包是计划的,通常包含比紧急补丁包更多的更改。当发现这些问题时,会发布紧急补丁包来解决一个或多个特定问题。

发布维护补丁包通常意味着 OTP <Minor> 版本的增加,而发布紧急补丁包通常意味着 OTP <Patch> 版本的增加。然而,情况并非总是如此,因为 OTP 版本的更改是基于代码的实际更改,而不是基于补丁是计划的还是非计划的。有关更多信息,请参见上面的 版本方案 部分。

所有已发布的 OTP 版本都可以在 OTP 版本树 中找到,该版本树在我们发布新 OTP 版本时会自动更新。请注意,每个版本号本身都明确定义了它在版本树中的位置。构建版本树只需要版本号。版本树的根是 OTP 版本 17.0,这是我们引入新 版本方案 的时候。绿色版本是主干上发布的正常版本。旧的 OTP 版本 会在从主干分支出来的 maint 分支上维护一段时间。旧的 maint 分支总是在将下一个 OTP 版本引入主干时从主干分支出来。这些旧的 maint 分支上的版本用蓝色标记。除了绿色和蓝色版本,还有灰色版本。这些是在分支上引入的版本,用于针对特定客户在特定基本版本上修复特定问题。带有灰色版本的版本分支通常会很快变成死胡同,如果不是立即的话。

以下列表详细说明了 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