官方文档: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.22.2.32.3.1等^0.2.1:0.2.20.2.3等
~表示包含相同次要版本和主要版本情况下,相等或者更好的版本:~2.2.0:2.2.02.2.12.2.2等
通过
><=>=<=或者-来表示范围(-左右有一个空格):>2.1:2.1.12.23.0.0等1.0.0 - 1.2.0:1.0.01.0.11.1.11.2.0等>= 2.1 <=3.1:2.1.03.0.13.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.03.8.04.14.1等
相关链接
更详细的规则: https://semver.org/
npm 语义化版本控制器: https://github.com/npm/node-semver