semver 语义化版本规范

semver

semver 简介


semver 是 语义化版本(Semantic Versioning)规范 的一个实现,目前是由 npm 的团队维护,实现了版本和版本范围的解析、计算、比较。

semver 的两个概念


  • 固定版本:是指例如 0.4.1、1.2.7、1.2.4-beta.0 这样表示包的特定版本的字符串。
  • 范围版本:是对满足特定规则的版本的一种表示,例如 1.2.3-2.3.4、1.x、^0.2、>1.4.

版本号格式


主版本号[MAJOR].次版本号[MINOR].修订号[PATCH],版本号递增规则如下:

  1. 主版本号:当做了不兼容的 API 修改,
  2. 次版本号:当做了向下兼容的功能性新增,
  3. 修订号:当做了向下兼容的问题修正。

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

当主版本号升级后,次版本号和修订号需要重置为0,次版本号进行升级后,修订版本需要重置为0。

先行版本号(Pre-release Version)

先行版本号可以作为发布正式版之前的版本,格式是在修订版本号后面加上一个连接号(-),再加上一连串以点(.)分割的标识符,标识符可以由英文、数字和连接号([0-9A-Za-z-])组成。example:

1.0​​.0-alpha
1.0.0-alpha.1
1.0.0-0.3.7
1.0.0-x.7.z.92

以下是一些常见的先行版本号名称:

  • alpha:是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用。
  • beta:也是测试版,这个阶段的版本会一直加入新的功能。在Alpha版之后推出
  • rc:Release Candidate) 系统平台上就是发行候选版本。RC版不会再加入新的功能了,主要着重于除错。

定义依赖版本号


npm 的依赖的规则中,还有 ~><=>=<=-||xX* 等符号;当使用 npm install XX 时,被安装的依赖的版本号前会默认加上 ^ 符号。

  • ^ :表示同一主版本号中,不小于指定版本号的版本号
 `^2.2.1` 对应主版本号为 2,不小于 `2.2.1` 的版本号,比如 `2.2.1`、`2.2.2`、`2.3.0` ,主版本号固定
// 当该依赖有最新版本时(eg:2.3.3),npm install 会安装最新的依赖
  • ~ :表示同一主版本号和次版本号中,不小于指定版本号的版本号
 `~2.2.1` 对应主版本号为 2,次版本号为 2,不小于 `2.2.1` 的版本号,比如 `2.2.1、2.2.2`,主版本号和次版本号固定
  • ><=>=<=-:用来指定一个版本号范围
 `>2.1`
 `1.0.0 - 1.2.0`
//注意使用 `-` 的时候,必须两边都有空格。
  • ||:表示或
 `^2 <2.2 || > 2.3`
  • xX*:表示通配符
 `*` 对应所有版本号
 `3.x` 对应所有主版本号为 3 的版本号

npm 中 package-lock.json 的一些坑


在 npm install 后,会生成一个 package-lock.json 文件用于保存当前安装依赖的各种来源及版本号。

在 npm 5.4.2版本后,package-lock.json 的变动规则:

  • 当在 install dependency 的指定版本时,会自动更新 package-lock.json 文件中该 dependency 的 version 到指定的 version
  • 当在 install dependency 的范围版本时,当前的 version 低于or等于 package-lock.json 文件中对应的 dependency 的 version 时,会安装 package-lock.json 中的 version;
package.json
"antd": "^3.6.1", // eg:最新版本是 3.9.4

package-lock.json
"antd": "3.7.1",

执行npm install 会安装 3.7.1 版本

如果高于 package-lock.json 中对应的 dependency 的 version 时,会安装当前范围版本号中最高的版本,会更新 package-lock.json 文件中对应的版本号;

推荐阅读更多精彩内容