npm 语义化版本控制

官方文档: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
2
3
4
"dependencies": {
"dep_1": "^1.0.0",
"dep_2": "~2.2.0"
},

规则如下:

  1. ^ 表示不增加从左到右第一个非0的部分的,所有其他部分不减少的版本如:

    • ^2.2.1 : 2.2.2 2.2.3 2.3.1
    • ^0.2.1 : 0.2.2 0.2.3
  2. ~ 表示包含相同次要版本和主要版本情况下,相等或者更好的版本:

    • ~2.2.0 : 2.2.0 2.2.1 2.2.2
  3. 通过 > < = >= <= 或者 - 来表示范围( - 左右有一个空格):

    • >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
  4. 包含预览版本,如带有 alphabeta 等标志的版本如:

    • 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 的风险,所以不让其满足范围匹配。

  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