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],版本号递增规则如下:
- 主版本号:当做了不兼容的 API 修改,
- 次版本号:当做了向下兼容的功能性新增,
- 修订号:当做了向下兼容的问题修正。
先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。
当主版本号升级后,次版本号和修订号需要重置为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 的依赖的规则中,还有 ~
、>
、<
、=
、>=
、<=
、-
、||
、x
、X
、*
等符号;当使用 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`
-
x
、X
、*
:表示通配符
`*` 对应所有版本号
`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 文件中对应的版本号;