语义化版本(Semantic Versioning)规范摘要
依赖地狱。通过版本号管理依赖、识别依赖包的软件兼容性风险。
使用语义化版本控制的软件必须定义公共 API。其版本规范是为了对其公共API的变化进行规范化的约束管理。
标记版本号的软件发行后,禁止改变;任何修改都必须以新版本发行。主版本号为0时是开发版,一切变化皆有可能;当主版本号>=1时为发行版,必须保持公共API的稳定,其版本变更需遵循如下规范。
版本号构成规则
语义化的版本号,由五部分组成【X.Y.Z-P+M】,即:【主版本号.次版本号.修订号-先行版本号+版本编译元数据】。
标准版本号仅包含X、Y、Z三部分。
其中 X、Y 和 Z 为非负的整数,变更时必须递增;P、M是一连串以句点分隔的标识符,是可以省略的。
版本号的五个组成部分,均不可以包含空白、标识符由 [0-9A-Za-z-] 组成、句点分割的纯数字部分禁止在数字前方补零。
常见的先行版本号名称:
- alpha:内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用。
- beta:测试版,这个阶段的版本会一直加入新的功能。在Alpha版之后推出
- rc:(Release Candidate) 发行候选版本。RC版不会再加入新的功能了,主要着重于除错。
1.0.0-alpha、1.0.0-alpha.1、1.0.0-0.3.7、1.0.0-x.7.z.92、1.0.0-alpha+001、1.0.0+20130313144700、1.0.0-beta+exp.sha.5114f85。
版本号递增规则
- 主版本号:进行了不兼容的 API 修改
- 次版本号:API 向下兼容、新增了功能
- 修订号:API 向下兼容、进行了Bub修正
- 主版本号递增时,次版本号、修订号都必须要归零;次版本号递增时,修订号必须归零
1.9.1 -> 1.10.0 -> 1.10.1 -> 1.10.2 -> 1.11.0
版本号比较规则
版本的优先层级指的是不同版本在排序时如何比较。M部分不参与比较。
版本号的X、Y、Z、P四个部分拆分后,由左到右依序比较每个标识符,第一个差异值用来决定优先层级。
包含P的版本号的优先级低于相关联的标准版本号。
P部分的多个标识符也得拆分后,由左到右依序比较每个标识符,第一个差异值用来决定优先层级。
纯数字的标识符按数字比较,非纯数字的标识符按字符串比较。数字的标识符比非数字的标识符优先层级低。
若开头的标识符都相同时,标识符个数多的优先层级高。
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。
规范实现
semver 是 语义化版本规范 的一个实现,实现了版本和版本范围的解析、计算、比较,由 npm 的团队维护。
- 固定版本:是指例如 0.4.1、1.2.7、1.2.4-beta.0 这样表示包的特定版本的字符串。
- 范围版本:是对满足特定规则的版本的一种表示,例如 1.2.3-2.3.4、1.x、^0.2、>1.4.
版本号依赖定义语法
x
、X
、*
:表示通配符^
表示同一主版本号中,不小于指定版本号的版本号~
:表示同一主版本号和次版本号中,不小于指定版本号的版本号>
、<
、=
、>=
、<=
、-
:用来指定一个版本号范围||
:表示或