软件版本号详解:从语义化版本到预发布标识
语义化版本(Semantic Versioning)
语义化版本是目前最广泛使用的版本号规范,格式为:主版本号.次版本号.修订号(MAJOR.MINOR.PATCH)
版本格式:X.Y.Z
X: 主版本号(Major)- 不兼容的 API 修改
Y: 次版本号(Minor)- 向下兼容的功能性新增
Z: 修订号(Patch) - 向下兼容的问题修正
示例说明
1.0.0 → 首次正式发布
1.0.1 → 修复了一些 bug,向下兼容
1.1.0 → 新增了功能,向下兼容
2.0.0 → 有破坏性更新,不向下兼容
版本号递增规则
修订号(Patch):修复 bug,不影响 API
1.0.0→1.0.1- 例如:修复内存泄漏、样式问题等
次版本号(Minor):新增功能,但向下兼容
1.0.1→1.1.0- 例如:新增 API、新增组件等
- 修订号归零
主版本号(Major):重大更新,不兼容旧版本
1.1.0→2.0.0- 例如:API 重构、删除废弃功能等
- 次版本号和修订号都归零
npm 版本符号详解
在 package.json 中,版本号前的符号决定了依赖包的更新策略:
| 符号 | 说明 | 示例 | 允许安装的版本范围 |
|---|---|---|---|
^(插入符) | 兼容补丁和次要版本更新 | ^1.2.3 | >=1.2.3 <2.0.0 |
~(波浪符) | 只兼容补丁版本更新 | ~1.2.3 | >=1.2.3 <1.3.0 |
* | 接受任何版本 | * | 任何版本 |
> | 大于某个版本 | >1.2.3 | >1.2.3 |
>= | 大于或等于某个版本 | >=1.2.3 | >=1.2.3 |
< | 小于某个版本 | <1.2.3 | <1.2.3 |
<= | 小于或等于某个版本 | <=1.2.3 | <=1.2.3 |
| 无符号 | 精确匹配 | 1.2.3 | 1.2.3(完全匹配) |
- | 版本范围 | 1.2.3 - 2.3.4 | >=1.2.3 <=2.3.4 |
|| | 或 | ^1.0.0 || ^2.0.0 | 1.x.x 或 2.x.x |
常用符号详解
插入符 ^(最常用)
"vue": "^3.2.0"
- 允许更新次版本号和修订号
^3.2.0可以安装3.2.0到3.x.x(但不包括4.0.0)- npm install 默认使用
^
波浪符 ~(更严格)
"axios": "~1.2.0"
- 只允许更新修订号
~1.2.0可以安装1.2.0到1.2.x(但不包括1.3.0)- 适合对稳定性要求高的场景
精确版本(最严格)
"react": "18.2.0"
- 完全锁定版本,不允许任何更新
- 适合生产环境或对版本极其敏感的依赖
预发布版本标识
预发布版本通过在版本号后添加连字符和标识符来表示:
1.0.0-alpha.1 → Alpha 内测版本
1.0.0-beta.1 → Beta 公测版本
1.0.0-rc.1 → Release Candidate 候选版本
版本阶段说明
| 版本标识 | 全称 | 说明 | 适用场景 |
|---|---|---|---|
alpha | Alpha(内测版) | 内部测试版本,功能不完整,存在较多 bug | 开发团队内部测试 |
beta | Beta(公测版) | 公开测试版本,功能基本完整,会持续加入新功能 | 公开测试,收集反馈 |
rc | Release Candidate | 发布候选版本,功能完整,不再增加新功能,主要修复 bug | 正式发布前的最后测试 |
stable | Stable(稳定版) | 正式发布的稳定版本 | 生产环境使用 |
lts | Long Term Support | 长期支持版本,会持续维护和修复 bug | 对稳定性要求高的项目 |
next | Next(下一代版本) | 下一个大版本的开发版本 | 尝鲜最新特性 |
canary | Canary(金丝雀版) | 每日构建版本,包含最新提交的代码 | 开发者测试最新功能 |
版本发布流程
开发阶段
↓
1.0.0-alpha.1 → 内部测试,功能开发中
↓
1.0.0-alpha.2 → 修复 bug,继续开发
↓
1.0.0-beta.1 → 公开测试,功能基本完成
↓
1.0.0-beta.2 → 修复 bug,优化性能
↓
1.0.0-rc.1 → 发布候选,准备发布
↓
1.0.0-rc.2 → 最后的 bug 修复
↓
1.0.0 → 正式发布 🎉
实际应用示例
Vue 3 的版本发布
3.0.0-alpha.0 → 2020-01-16 第一个内测版
3.0.0-alpha.13 → 2020-07-18 最后一个内测版
3.0.0-beta.1 → 2020-04-16 第一个公测版
3.0.0-beta.24 → 2020-08-20 最后一个公测版
3.0.0-rc.1 → 2020-07-18 第一个候选版
3.0.0-rc.13 → 2020-09-17 最后一个候选版
3.0.0 → 2020-09-18 正式发布
3.0.1 → 2020-09-19 修复 bug
3.1.0 → 2021-06-07 新增功能
3.2.0 → 2021-08-09 新增功能
React 的版本策略
16.8.0 → 引入 Hooks
17.0.0 → 无新功能,专注于升级便利性
18.0.0 → 引入并发特性,重大更新
最佳实践
1. 选择合适的版本符号
{
"dependencies": {
// 推荐:对于成熟的库使用 ^
"vue": "^3.2.0",
"react": "^18.2.0",
// 严格:对稳定性要求高的使用 ~
"axios": "~1.2.0",
// 锁定:生产环境关键依赖
"typescript": "5.0.4"
},
"devDependencies": {
// 开发依赖可以放宽限制
"vite": "^4.0.0"
}
}
2. 使用 package-lock.json
- 锁定所有依赖的精确版本
- 确保团队成员安装相同的依赖版本
- 避免 "在我机器上能运行" 的问题
3. 定期更新依赖
# 查看可更新的依赖
npm outdated
# 更新所有依赖到符合规则的最新版本
npm update
# 更新到最新版本(可能包含破坏性更新)
npm install <package>@latest
4. 发布自己的包时
# 发布修订版本(bug 修复)
npm version patch # 1.0.0 → 1.0.1
# 发布次版本(新功能)
npm version minor # 1.0.1 → 1.1.0
# 发布主版本(破坏性更新)
npm version major # 1.1.0 → 2.0.0
# 发布预发布版本
npm version prerelease --preid=alpha # 1.0.0 → 1.0.1-alpha.0
其他概念
RTM(Release to Manufacturing)
制造发布版本,软件正式交付给生产商制造的版本,通常就是正式版。
LTS(Long Term Support)
长期支持版本,会持续提供安全更新和 bug 修复,适合生产环境:
Node.js LTS 版本:
- 12.x → 2019-10 到 2022-04
- 14.x → 2020-10 到 2023-04
- 16.x → 2021-10 到 2024-04
- 18.x → 2022-10 到 2025-04
Nightly Build / Canary
每日构建版本,包含最新提交的代码,用于测试最新功能:
Chrome Canary → 每日更新的 Chrome 版本
Next.js Canary → next@canary
总结
- ✅ 使用语义化版本:遵循
主.次.修订规范 - ✅ 理解版本符号:
^用于常规依赖,~用于严格场景 - ✅ 关注预发布版本:了解 alpha、beta、rc 的区别
- ✅ 锁定依赖版本:使用
package-lock.json - ✅ 定期更新依赖:保持依赖的安全性和稳定性
