本文目录导读:

开源项目中的版本号规范,最主流的是语义化版本控制,它被绝大多数现代开源项目(如 npm、GitHub、Linux 内核的变体)所采用。
下面是详细的规范说明,以及一些其他常见但不太主流的版本策略。
核心规范:语义化版本控制
这是最通用、最推荐的规范,其版本号格式为:MAJOR.MINOR.PATCH。
- MAJOR (主版本号):当你做了不兼容的 API 修改时增加。
- 含义:新版本无法向后兼容,比如你改了函数名、删除了一个功能、修改了请求参数结构。
- 用户影响:用户必须修改自己的代码才能升级。
- MINOR (次版本号):当你做了向下兼容的功能性新增时增加。
- 含义:添加了新功能,但旧代码依然能正常运行。
- 用户影响:用户可以放心升级,新功能会自然生效,旧功能不受影响。
- PATCH (修订号):当你做了向下兼容的问题修正时增加。
- 含义:修复了 Bug、性能问题,没有添加新功能。
- 用户影响:用户应该立即升级以获取更稳定更好的体验。
一个简单的记忆原则:
版本号
X.Y.Z,当 API 不兼容时(破坏性变更)升 X(主版本号),加新功能升 Y(次版本号),修 Bug 升 Z(修订号)。
进阶规范(常见于 Release 阶段)
在基础版本号之后,还可以添加预发布版本和构建元数据,格式为:MAJOR.MINOR.PATCH-PRERELEASE+BUILD。
- 预发布版本 (Pre-release):通过连字符 紧跟版本号后,表示该版本不稳定、不完全,仅供测试。
- 常见后缀:
-alpha(内测)、-beta(公测)、-rc.1(候选发布版)。 - 示例:
0.0-alpha.1,3.0-rc.2。 - 优先级:预发布版本的优先级低于正式版本。
0.0-alpha<0.0。
- 常见后缀:
- 构建元数据 (Build Metadata):通过加号 紧跟版本号后,表示构建相关的信息,不参与版本优先级比较。
- 示例:
0.0+build.20240315,4.1+sha.9876abc。 - 作用:方便追踪构建来源,但当你比较版本大小时,
0.0+build123和0.0+build456被认为是同一个版本(即0.0)。
- 示例:
何时使用语义化版本?
- 有明确 API 的项目:库、框架、SDK 或 CLI 工具,用户需要依赖它、调用它的接口。
- 需要明确依赖管理:如 npm、Maven、pip、Cargo 等包管理器。
其他常见版本策略
并非所有项目都严格使用语义化版本,以下是一些变体:
-
日期/日历版本:格式如
03.15或03。- 使用场景:大型复杂项目,功能发布与日历强相关,且不强调“破坏性变更”的明确定义。
- 例子:Ubuntu (22.04, 24.04),Ubuntu 版本本身就是日期。Python 的
12.0中.12也隐含了年份。 - 优缺点:容易知道“新不新”,但难以判断兼容性。
-
统一版本号 (Unity Versioning):所有组件共享一个版本号(如
0.0)。- 使用场景:一个项目包含多个子模块(前端、后端、数据库迁移脚本),发布时一起打包。
- 例子:很多内部项目或 Docker 镜像。
- 注意:这样做会丢失细粒度的兼容性信息。
-
渐进式增强(如 Linux 内核,但非严格的语义化):
- Linux 内核的版本号现在基本接近语义化,但历史上(2.6.x 时代)有不同含义,现代 Linux 内核版本如
8.0,基本遵循 MAJOR.MINOR.PATCH,但-rc1、-next等预发布机制非常活跃。
- Linux 内核的版本号现在基本接近语义化,但历史上(2.6.x 时代)有不同含义,现代 Linux 内核版本如
-
慢速发布:保持
y.z很长一段时间。- 例子:软件尚未成熟,
1.0、2.0等。x版本不做严格向后兼容承诺。注意:语义化规范中,y.z不被视为正式发布,可以随时做破坏性变更。
- 例子:软件尚未成熟,
给开源项目维护者的建议
- 优先选择语义化版本:这是公认的标准,用户理解成本最低,依赖管理工具(如 npm’s 、)也是基于它设计的。
- 严格区分 MAJOR 和 MINOR:即使是修改一个返回值的类型,如果会导致用户代码报错,也属于破坏性变更,必须升 MAJOR。
- 预发布版本要小心:
-rc.1(Release Candidate)表示功能已冻结,只待修复 Bug;-beta表示还在加功能或改接口,不要在-rc之后突然加个破坏性功能。 - 考虑使用“版本生命周期”:
0.0(Current),1.0(Active),2.0(LTS),0.0(Next),但版本号本身仍应严格遵循语义化。 - 保持一致性:一旦确定版本策略,就在项目的
README、CONTRIBUTING和CHANGELOG中明确说明,并严格执行。
- 最推荐:语义化版本控制 (
MAJOR.MINOR.PATCH),配合-alpha、-beta、-rc。 - 记住核心:
- MAJOR:破坏性变更(不兼容)
- MINOR:功能性新增(向后兼容)
- PATCH:问题修正(向后兼容)
- 什么时候可以例外:如果你的项目不是 API 库(比如一个图形界面应用、一个文档项目、一个内部工具),可以简化版本策略,但为了社区友好,语义化版本依然是最好的选择。
遵循规范能让你的项目更专业,让用户(以及依赖管理工具)安心地使用和升级。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播