语义化版本号

2021-01-26  本文已影响0人  _昴_

本文根据《语义化版本 2.0.0》一文稍作修改。

摘要

版本格式

主版本号.次版本号.修订版本号

版本号递增规则
  1. 主版本号:做了不兼容的API修改;

  2. 次版本号:做了向下兼容的功能性新增;

  3. 修订号:做了向下兼容的问题修正。

先行版本号及版本编译元数据可以加到“主版本号.次版本号.修订号”的后面,作为延伸。

API:(Application Programming Interface,应用程序接口)是一些预先定义的接口(比如函数、HTTP接口),或指软件系统中不同组成部分衔接的约定。目的是提供应用程序以及开发人员基于某软件或硬件得以访问一组例程的能力。

简介

用一组简单的规则及条件来约束版本号的配置和增长。需要定义好公共的API,可以通过文件定义或代码强制要求来实现。这样可以修改相应的版本号来说明修改。

采用以下格式:

X.Y.Z(主版本号.次版本号.修订号)

修复问题但不影响API时,递增修订号;API保持向下兼容的新增及修改时,递增次版本号;进行不向下兼容的修改时,递增主版本号。

语义化版本控制规范(SemVer)

RFC(Request for Comments,意见征求稿),涵盖了互联网的各种标准。RFC 2119讲的是在RFC中用于指示需求级别的关键字,包括“MUST”,“MUST NOT”,“REQUIRED”,“SHALL”,“SHALL NOT”,“SHOULD”,“SHOULD NOT”, “RECOMMENDED”,“MAY” 以及 “OPTIONAL”。

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

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

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

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

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

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

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

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

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

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

  11. 版本的优先层级:指的是不同版本在排序时如何比较。判断优先层级时,必须(MUST)把版本依序拆分为主版本号、次版本号、修订号以及先行版本号后进行比较(版本编译元数据不在这份比较的列表中)。由左到右依序比较每个标识符,第一个差异值用来决定优先层级:主版本号、次版本号及修订号以数值比较,例如1.0.0<2.0.0<2.1.0<2.1.1。当主版本号、次版本号及修订号的两个先行版本号,其优先层级必须(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。

为什么要使用语义化的版本控制

这并不是一个新的或者革命性的想法。实际上,你可能已经在做一些近似的事情了。问题在于只是“近似”还不够。如果没有某个正式的规范可寻,版本号对于依赖的管理并无实质意义。将上述的想法命名并给予清楚的定义,让你对软件使用这传达意向变得容易。一旦这些意向变得清楚,弹性(但又不会太弹性)的依赖规范就能达成。

例如:可以展示语义化的版本控制如何让”依赖地狱“成为过去。假设这有个名为“救火车”的函式库,它需要另一个名为“梯子”并已经有使用语义化版本控制的包。当“救火车”创建时,“梯子”的版本号为3.1.0。因为“救火车”使用了一些版本3.1.0中的新增的功能,你可以放心地指定依赖于“梯子”的版本号大于等于3.1.0但小于4.0.0。这样,当“梯子”版本3.1.1和3.2.0发布时,你可以直接将它们纳入你的包管理系统,因为它们能与原有依赖的软件兼容。

作为一位负责任的开发者,你理当确保每次包升级的运作与版本号的表述一致。现实世界是复杂的,我们除了提高警觉以外能做的不多。你所能做的就是让语义化的版本控制为你提供一个健全的方式来发行以及升级包,而无需推出新的依赖包,节省你的 时间及烦恼。

如果你对此认同,希望立即开始使用语义化版本控制,你只需声明你的函数库正在使用它并遵循这些规则就可以了。请在你的README文件中保留此页链接,让别人也知道这些规则并从中受益。

问答及建议

上一篇下一篇

猜你喜欢

热点阅读