软件版本号规范建议

什么是版本

版本是一种称谓,用于描述同一事物的相互之间有差异的各种形式、状态或内容。

“版”在这里原意是印刷用的模板,“本”的意思是书籍。因此,版本最初用于描述书籍的不同形式、状态或内容。第一次出版,称为初版。如果印刷内容未改,而之后再付印的话,则不称为再版,而称为“初版第○刷”或“第1版第○刷”,○为重印次数,例如“第1版第2刷”。内容有更动,可称为“改版”或“新版”。这是为了让读者可以明确知道书籍内容有无实质变化。不过,不诚实的出版业者或作者可能故意宣称书籍“出新版”,即便内容全无改变,以增加销售量。

现今版本可用于描述书籍、电影、法律、观点、软件等事物。一个事物可能因各种原因而有不同版本,如作者修订、发布环境改变、传播过程影响等。不同版本的差异形形色色,如某歌手所发行的同张专辑可能同时发行CD和录音带版本;某部法律为适应社会新变化,于经过修订后发布并生效新版本。

为什么要设置软件版本号

  • 通过版本号确定项目当前的状态。
  • 清晰软件当前的依赖及兼容性。
  • 明确软件周期性进度。
  • 方便软件开发的流程管理。

软件的版本周期

st=>start: 开始
pre=>operation: Pre-alpha
alpha=>operation: Alpha
beta=>operation: Beta
rc=>operation: Release Candidate
rtm=>operation: RTM
ga=>operation: GA
gold=>operation: Production or live release aka Gold
e=>end: 结束
op=>operation: 我的操作
cond=>condition: 确认?

pre->alpha->beta->rc->rtm->ga->gold

软件版本周期是指电脑软件的发展及发行过程,如图,从Pre-alpha(准预览版本)发展到Alpha(预览版本)、Beta(测试版本)、Released candidate (最终测试版本)至最后的Gold(完成版)。

开发期

Pre-alpha

有时候软件会在Alpha或Beta版本前先发布Pre-alpha版本。一般而言相对于Alpha或Beta版本,Pre-alpha版本是一个功能不完整的版本。

Alpha

Alpha版本仍然需要测试,其功能亦未完善,因为它是整个软件发布周期中的第一个阶段,所以它的名称是“Alpha”,希腊字母中的第一个字母“α”。

Alpha版本通常会送到开发软件的组织或某群体中的软件测试者作内部测试。在市场上,越来越多公司会邀请外部客户或合作伙伴参与其测试。这令软件在此阶段有更大的可用性测试。

在测试的第一个阶段中,开发者通常会进行白盒测试。其他测试会在稍后时间由其他测试团体以黑盒或灰盒技术进行,不过有时会同时进行。

Beta

Beta版本是软件最早对外公开的软件版本,由公众参与测试。一般来说,Beta包含所有功能,但可能有一些已知问题和较轻微的程序错误(BUG)。Beta版本的测试者通常是开发软件的组织的客户,他们会以免费或优惠价钱得到软件。Beta版本亦作为测试产品的支持和市场反应等。

其他情况,例如微软曾以Community Technology Preview(简称CTP,中文称为“社区技术预览”)为发布软件的测试版本之一,微软将这个阶段的软件散布给有需要先行试用的用户或厂商,并收集这些人的使用经验,以便作为进一步修正软件的引用。

Release Candidate

Release Candidate(简称RC)指可能成为最终产品的候选版本,如果未出现问题则可发布成为正式版本。在此阶段的产品通常包含所有功能、或接近完整,亦不会出现严重问题。

多数开源软件会推出两个RC版本,最后的RC2则成为正式版本。闭源软件较少公开使用,微软公司在Windows 7上应用此名称。苹果公司把在这阶段的产品称为“Golden Master Candidate”(简称GM Candidate),而最后的GM即成为正式版本。

完成期

生产商发放(Release to Manufacting,RTM)

生产商发放(Release to Manufacturing,缩写RTM)是软件产品准备交付时使用的术语。某些计算机程序以“RTM”作为软件版本代号,例如微软Windows 7发行零售版前的RTM版本主要是发放给组装机生产商用,使制造商能够提早进行集成工作或解决软件与硬件设备可能遇到的错误。RTM版本并不一定意味着创作者解决了软件所有问题;仍有可能向公众发布前更新版本。以Windows 7为例:RTM版与零售版的版本号是一样的。

一般可用(General availability,GA)

一般可用(General availability, 缩写GA)是所有必要的商业活动已经完成,该软件产品已经可以发售的阶段。然而,这取决于语言、地域和电子设备与媒体的可用性。商业活动可能也包括安全性和合法测试,以及本地化和全球销售的可能性评估。RTM与GA的间隔可能会是1周或几个月,因为在此过程中需要进行许多商业活动·。在这个阶段,可以说软件已经“上线”了。

网络分发(Release to Web,RTW)

网络分发(Release to Web,缩写RTW),或称Web发布是一种利用互联网进行分发的软件交付方式。制造商在这种类型的发布中并不生产实体软件。随着互联网使用人数的增长,RTW变得越来越普遍。

稳定版(Stable)

稳定版本来自预览版本释出使用与改善而修正完成。为目前所使用的软件在匹配需求规格的硬件与操作系统中运行不会造成严重的不兼容或是硬件冲突,其已受过某定量的测试无误后所释出者。

软件版本号的一般格式

GNU 风格

主版本号.子版本号[.修正版本号[.编译版本号]] 英文对照: major.minor[.revision[.build]] 示例: 1.2.1,2.0, 5.0.0 build-13124

Windows 风格

主版本号.子版本号[.修正版本号[.编译版本号]] 英文对照: major.minor[.revision[.build]] 示例: 1.21, 2.0

.Net Framework 风格

主版本号.子版本号[.编译版本号[.修正版本号]] 英文对照: major.minor[.build[.revision]] 示例: 1.21, 2.0

我们应该使用什么样的版本号规则

建议采用major.minor.revision格式的语意版本号 具体规则:

语义化版本控制规范(SemVer) 以下关键词 MUST、MUST NOT、REQUIRED、SHALL、SHALL NOT、SHOULD、SHOULD NOT、 RECOMMENDED、MAY、OPTIONAL 依照 RFC 2119 的叙述解读。(译注:为了保持语句顺畅, 以下文件遇到的关键词将依照整句语义进行翻译,在此先不进行个别翻译。)

使用语义化版本控制的软件“必须 MUST ”定义公共 API。该 API 可以在代码中被定义或出现于严谨的文件内。无论何种形式都应该力求精确且完整。

标准的版本号“必须 MUST ”采用 XYZ 的格式,其中 X、Y 和 Z 为非负的整数,且“禁止 MUST NOT”在数字前方补零。X 是主版本号、Y 是次版本号、而 Z 为修订号。每个元素“必须 MUST ”以数值来递增。例如:1.9.1 -> 1.10.0 -> 1.11.0。

标记版本号的软件发行后,“禁止 MUST NOT ”改变该版本软件的内容。任何修改都“必须 MUST ”以新版本发行。

主版本号为零(0.y.z)的软件处于开发初始阶段,一切都可能随时被改变。这样的公共 API 不应该被视为稳定版。

1.0.0 的版本号用于界定公共 API 的形成。这一版本之后所有的版本号更新都基于公共 API 及其修改内容。

修订号 Z(x.y.Z | x > 0)“必须 MUST ”在只做了向下兼容的修正时才递增。这里的修正指的是针对不正确结果而进行的内部修改。

次版本号 Y(x.Y.z | x > 0)“必须 MUST ”在有向下兼容的新功能出现时递增。在任何公共 API 的功能被标记为弃用时也“必须 MUST ”递增。也“可以 MAY ”在内部程序有大量新功能或改进被加入时递增,其中“可以 MAY ”包括修订级别的改变。每当次版本号递增时,修订号“必须 MUST ”归零。

主版本号 X(X.y.z | X > 0)“必须 MUST ”在有任何不兼容的修改被加入公共 API 时递增。其中“可以 MAY ”包括次版本号及修订级别的改变。每当主版本号递增时,次版本号和修订号“必须 MUST ”归零。

先行版本号“可以 MAY ”被标注在修订版之后,先加上一个连接号再加上一连串以句点分隔的标识符号来修饰。标识符号“必须 MUST ”由 ASCII 码的英数字和连接号 [0-9A-Za-z-] 组成,且“禁止 MUST NOT ”留白。数字型的标识符号“禁止 MUST NOT ”在前方补零。先行版的优先级低于相关联的标准版本。被标上先行版本号则表示这个版本并非稳定而且可能无法达到兼容的需求。范例:1.0.0-alpha、1.0.0-alpha.1、1.0.0-0.3.7、1.0.0-x.7.z.92。

版本编译信息“可以 MAY ”被标注在修订版或先行版本号之后,先加上一个加号再加上一连串以句点分隔的标识符号来修饰。标识符号“必须 MUST ”由 ASCII 的英数字和连接号 [0-9A-Za-z-] 组成,且“禁止 MUST NOT ”留白。当判断版本的优先层级时,版本编译信息“可 SHOULD ”被忽略。因此当两个版本只有在版本编译信息有差别时,属于相同的优先层级。范例:1.0.0-alpha+001、1.0.0+20130313144700、1.0.0-beta+exp.sha.5114f85。

版本的优先层级指的是不同版本在排序时如何比较。判断优先层级时,“必须 MUST ”把版本依序拆分为主版本号、次版本号、修订号及先行版本号后进行比较(版本编译信息不在这份比较的列表中)。由左到右依序比较每个标识符号,第一个差异值用来决定优先层级:主版本号、次版本号及修订号以数值比较,例如:1.0.0 < 2.0.0 < 2.1.0 < 2.1.1。当主版本号、次版本号及修订号都相同时,改以优先层级比较低的先行版本号决定。例如:1.0.0-alpha < 1.0.0。有相同主版本号、次版本号及修订号的两个先行版本号,其优先层级“必须 MUST ”透过由左到右的每个被句点分隔的标识符号来比较,直到找到一个差异值后决定:只有数字的标识符号以数值高低比较,有字母或连接号时则逐字以 ASCII 的排序来比较。数字的标识符号比非数字的标识符号优先层级低。若开头的标识符号都相同时,栏位比较多的先行版本号优先层级比较高。范例:1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0- rc.1 < 1.0.0。

例如:1.2.10-test

第一个主版本的.第二个功能特性的.第十次修正版-测试版

例如:1.0.10-alpha

1.0.10的预览版

更多参见:语义化版本 2.0.0

参考