语义化版本号(Semantic Versioning)
版本号不仅仅是一个标识,它向使用者传达了这个包做了哪些变更、能不能安全升级。理解语义化版本号是后续学习版本控制、发包和依赖管理的基础。
版本号格式
语义化版本号遵循 主版本号.次版本号.修订号 的格式,即 MAJOR.MINOR.PATCH:
2.1.3
│ │ │
│ │ └── PATCH:bug修复,向下兼容
│ └──── MINOR:功能新增,向下兼容
└────── MAJOR:不兼容的API变更
text
后面可能还会接先行版本号和构建元数据:
2.1.3-beta.1+build.123
│ │ │ │ │
│ │ │ │ └── 构建元数据(可选)
│ │ │ └────────── 先行版本号(可选)
│ │ └────────────── PATCH
│ └──────────────── MINOR
└────────────────── MAJOR
text
先行版本号含义
| 标识 | 全称 | 含义 | 稳定性 |
|---|---|---|---|
| alpha | Alpha | 内部测试版本 | 非常不稳定,可能有大量bug |
| beta | Beta | 公开测试版本 | 功能基本完成,需要外部测试 |
| rc | Release Candidate | 发布候选版本 | 不再加新功能,只做最后的排错 |
以Vue 3的发布过程为例,经历了 3.0.0-alpha.0 → 3.0.0-beta.1 → 3.0.0-rc.1 ... 3.0.0-rc.10 → 3.0.0 的完整周期,RC阶段就持续了10个版本。
版本号变更规则
PATCH更新:1.0.0 → 1.0.1(修bug)
MINOR更新:1.0.1 → 1.1.0(新功能,MINOR更新时PATCH归零)
MAJOR更新:1.1.0 → 2.0.0(破坏性变更,MINOR和PATCH都归零)
text
npm version命令
手动修改package.json中的版本号容易出错。npm version命令提供了标准化的版本管理,同时会自动创建一个Git提交和标签。
基本用法
# 查看当前版本
npm version
# 更新PATCH版本(修bug)
npm version patch
# 1.0.0 → 1.0.1
# 更新MINOR版本(新功能)
npm version minor
# 1.0.1 → 1.1.0
# 更新MAJOR版本(破坏性变更)
npm version major
# 1.1.0 → 2.0.0
bash
先行版本操作
# 创建alpha先行版本
npm version prealpha
# 1.0.2 → 1.0.3-alpha.0
# 更新alpha的迭代号
npm version prerelease --preid=alpha
# 1.0.3-alpha.0 → 1.0.3-alpha.1
# 从alpha切换到beta
npm version prerelease --preid=beta
# 1.0.3-alpha.2 → 1.0.3-beta.0(注意:迭代号归零)
# 从beta切换到rc
npm version prerelease --preid=rc
# 1.0.3-beta.1 → 1.0.3-rc.0
# 先行版本结束后,正式发布
npm version patch
# 1.0.3-rc.2 → 1.0.3(正式发布)
bash
常用选项
# 不创建Git标签
npm version patch --no-git-tag-version
# 查看帮助
npm version --help
bash
npm version自动执行的操作
执行npm version patch时,npm会依次做三件事:
- 修改
package.json中的version字段 - 创建一个Git commit,提交消息就是新版本号(如
v1.0.1) - 创建一个Git tag,标签名为
v1.0.1
# 查看自动创建的提交
git reflog
# 查看自动创建的标签
git tag
bash
最佳实践
- 先行版本只在大版本更新时使用:如从1.x升级到2.0时走
alpha → beta → rc → release流程 - 小版本更新直接使用:
npm version patch或npm version minor即可 - monorepo项目中使用工具管理版本:如 changesets 或 lerna version
- CI/CD中自动化版本发布:结合
conventional commits规范,使用工具自动判定版本号
// package.json 中配置commit消息模板
{
"version": "1.0.0",
"scripts": {
"release:patch": "npm version patch -m 'chore(release): %s'",
"release:minor": "npm version minor -m 'chore(release): %s'",
"release:major": "npm version major -m 'chore(release): %s'"
}
}
json
↑