semver 全称叫 Semantic Version 即语义化版本
简单来说就是一个社区约定的版本号规范,目的是为了让版本号更加语义化,更加见名知意
格式为
MAJOR.MINOR.PATCH-PRERELEASE+BUILD
| 部分 | 说明 | 是否必选 |
|---|---|---|
| MAJOR | 主版本号,破坏兼容性更新 | 必选 |
| MINOR | 次版本号,向前兼容新增功能 | 必选 |
| PATCH | 修订号,仅修复 bug | 必选 |
| PRERELEASE | 预发布标识(alpha/beta/rc 等) | 可选 |
| BUILD | 构建元数据(时间戳/哈希等) | 可选,基本不用 |
先行版本
可以在版本号后加 - 和标识符,表示预发布版本
预发布版本的优先级低于同一正式版本。
其中标识符是可以自定义的,并没有严格规定。
- 命名格式 ⇒ 必须由 ASCII 字母、数字和连字符(
[0-9A-Za-z-])组成,不能留空 - 多个标识符可以用
.分隔,如:1.0.0-alpha.1
社区一般流行以下几种标识符
alpha(阿尔法,内测版,功能不全,可能不稳定)beta(测试版,功能较全,可能有 bug)rc(Release Candidate,候选发布版,接近正式版)dev(开发版)preview(预览版)
版本优先级
- 从左到右依次比较:
MAJOR→MINOR→PATCH - 遇到不一样的数字就结束比较,直接决定大小。
因此对应优先级从高到低依次为:
MAJORMINORPATCHPre-release
相同版本的不同预发布版本比较规则
-
顺序从左到右,一一对应比较。
-
数值和字符串分开比较。
- 数字 < 字母(数字优先级更低)
- 数字:按数值大小比(比如
1 < 2) - 字母:按 ASCII 字典序比(比如
alpha < beta) - 如果一方有更多标识符(比如
alpha.1vsalpha),短的优先级低(alpha < alpha.1)
例子:
1.0.0>1.0.0-beta2.1.0>2.0.51.2.3>1.2.3-alpha.11.2.0-beta.2>1.2.0-alpha.2
版本约束范围
^1.2.3:兼容 1.x.x 版本,但<2.0.0⇒ 锁大版本~1.2.3:兼容 1.2.x 版本,但<1.3.0⇒ 锁大版本和minor版本
npm version
npm version <version> 会执行
- 根据需求自动递增
package.json中version字段 - 使用
git tag命令打上对应的标签
| 类型 | 作用说明 | 举例后版本号变化 (假设原为 1.2.3) |
|---|---|---|
patch | 修订号 +1 | 1.2.4 |
minor | 次版本号 +1,修订号归0 | 1.3.0 |
major | 主版本号 +1,次/修订号归0 | 2.0.0 |
prerelease | 预发布号 +1 | 1.2.4-0(或 1.2.4-1) |
prepatch | 进入下一个 patch 的预发布版 | 1.2.4-0 |
preminor | 进入下一个 minor 的预发布版 | 1.3.0-0 |
premajor | 进入下一个 major 的预发布版 | 2.0.0-0 |
1.2.5 | 直接指定版本号 | 1.2.5 |
prepatch 、preminor 、premajor 是直接在对应版本号后边直接加上-0
prerelease 是
- 如果没有预发布版本,则加上
-0 - 否则在原有预发布版本号基础上
加 1
可以通过preid 指定对应的预发布标识 (如 alpha、beta、rc)
# 假如原版本是 v1.0.1 执行命令后是 v1.0.1-beta.0
# 假如原版本是 v1.0.1-alpha.1 或者 v1.0.1-1 执行命令后都是 v1.0.1-beta.0
# => 重置 preid 并把编号从 0 开始
npm version prerelease --preid=beta
我们也可以通过-m 来指定版本注释信息
# 注释信息中可以使用 %s 直接表示新版本号 => 注意版本号是不带v的
npm version major -m "Release version %s"
# 版本号注释信息可能是 Release version 2.0.0