官方文档:https://docs.npmjs.com/about-semantic-versioning
什么是语义化版本控制
通过语义化版本控制(Semantic Versioning Rules),可以让包使用者知道包的版本改变的情况,以及对其他包版本依赖情况。
在发布新版本时,npm 官方推荐版本规则如下:
版本情况 | 阶段 | 规则 | 举例 |
---|---|---|---|
首次发布 | 全新产品 | 从 1.0.0 开始 | 1.0.0 |
向前兼容的 bug 修复 | 补丁版本 | 在第三个数字上增加 | 1.0.1 |
向前兼容的新版本 | 次要版本 | 增加第二个数字,并且第三个数字置零 | 1.1.0 |
不向前兼容的新版本 | 主要版本 | 增加第一个数字,将第二、第三个数字归零 | 2.0.0 |
通过语义化版本控制表明依赖的包版本
在 package.json
文件里,通过定义 dependencies
来表明包的依赖情况如:
1 | "dependencies": { |
规则如下:
^
表示不增加从左到右第一个非0的部分的,所有其他部分不减少的版本如:^2.2.1
:2.2.2
2.2.3
2.3.1
等^0.2.1
:0.2.2
0.2.3
等
~
表示包含相同次要版本和主要版本情况下,相等或者更好的版本:~2.2.0
:2.2.0
2.2.1
2.2.2
等
通过
>
<
=
>=
<=
或者-
来表示范围(-
左右有一个空格):>2.1
:2.1.1
2.2
3.0.0
等1.0.0 - 1.2.0
:1.0.0
1.0.1
1.1.1
1.2.0
等>= 2.1 <=3.1
:2.1.0
3.0.1
3.1.0
等
包含预览版本,如带有
alpha
和beta
等标志的版本如:1.0.0-rc.1
预览版本之间有特殊匹配规则,如 >0.5.0-rc.1
能够匹配 >0.5.0-rc.2
,能够匹配 1.0.0
2.1.0
等,但是不能匹配 1.0.0-rc.1
。
也就是说,范围匹配在带有特殊标志的版本号之间是不适用的,仅仅适用于标志后面的版本号。主要出于以下原因:
(1) 预览版本有很多问题,并且可能很快迭代,换句话说可能不稳定,所以不能作为一个常规版本让大家使用,所以从语义化版本控制中特殊化处理。
(2) 假设使用预览版本的人能够接受当前版本的风险如 0.5.0-rc.1
但这不能证明他们能接受 1.0.0-rc.1
的风险,所以不让其满足范围匹配。
用
||
表示“或者”,如:^2 <2.2 || > 2.3
:2.0.0
3.8.0
4.14.1
等
相关链接
更详细的规则: https://semver.org/
npm 语义化版本控制器: https://github.com/npm/node-semver