语义化版本号详解

45 阅读4分钟

什么是语义化版本号

这是一个在软件开发中非常重要的概念。简单来说,语义化版本号 是一种为软件版本号赋予特定含义的规范,目的是让用户和开发者通过版本号就能清晰地了解这次更新带来了什么样的变化

{
  "dependencies": {
    "react": "^19.1.1",
    "react-dom": "^19.1.1",
    "react-router": "~7.8.2",
    "react-scripts": "5.0.1"
  }
}

经常做公共库、架构设计的同学都肯定会跟版本管理打交道,那么在版本管理中,就会涉及到版本号,这个版本号该怎么去编排,以及这个版本为什么是3个数字,每个数字代表什么意思呢?

版本号的含义

它的标准格式是:**主版本号.次版本号.修订号**(X.Y.Z),例如 2.1.3

各个版本号含义如下:

  • X(主版本号)

  • 递增时机:当你做了重大/不兼容的 API 修改

  • 含义:这是一个巨大的里程碑式更新,升级到这个版本可能会导致你之前写的代码无法正常工作,需要做相应的修改才能适配,所以也叫 Breaking updates

  • 例子:从 1.x.x 升级到 2.0.0

  • Y(次要版本号)

  • 递增时机:当你向下兼容地新增了功能

  • 含义:这是一个新功能更新,它添加了新特性,但不会破坏已有的接口。如果你是从同一个主版本的旧次版本升级过来,你的代码应该能无缝工作。

  • 例子:从 2.1.x 升级到升级到 2.2.0

  • Z(修订版本号)

  • 递增时机:当你做了向下兼容的问题修正

  • 含义:这是一个小的补丁更新,通常用于优化、修复 bug 和安全漏洞。完全没有新功能的引入,也不会影响现有功能。

  • 例子:从 2.1.3 升级到 2.1.4

纳尼?还不能理解?

一个生动的比喻

把软件想象成一栋房子:

  • 主版本号改变 (**2.0.0**):相当于相当于你把平房推倒,重建了一栋摩天大楼。结构完全不同了,你必须重新适应(修改代码)。
  • 次版本号改变 (**2.1.0**):相当于你在原来的房子里新盖了一个阳台。房子的主体结构没变,但你多了一个可以用的空间(新功能)。
  • 修订号改变 (**2.1.1**):相当于你修好了厨房里漏水的水龙头。房子没有任何结构或功能上的变化,只是解决了一个小问题(修复 Bug)。

核心规则

  1. 只增不减:版本号必须递增,不可回退(例:2.2.32.2.4后不可再用2.2.3,需使用2.2.5
  2. 高位变更后低位归零:主/次版本升级时,后续数字需重置为0(例:2.2.32.3.0而非2.3.1

预发布版本

除了核心的三个数字,版本号后面还可以加一些标签来表示特殊版本,用于尝鲜,表示我加入了一些比较新的功能,但是它的稳定性还不是很好,如果说你觉得有兴趣的话,可以来试用一下,但是我建议你不要在生产环境里面去用,系统炸了,出了问题别找我。

  • 格式:主.次.修-标签(例:2.2.3-alpha2.0.0-canary

  • 常见标签:

  • Canary(金丝雀版本):给“敢死队”用的,最早最快,也最危险

  • Alpha(内部测试版):给“自己人”用的,功能不全,Bug很多

  • Beta(公开测试版):给“大家”用的,功能齐全,找小毛病

为什么需要

  1. 清晰的沟通:用户和开发者看一眼版本号就能判断出更新的重要性、风险和所需的工作量
  2. 依赖管理自动化:现代包管理器(比如npm)严重依赖语义化版本

语义化版本号控制

符号

名称

匹配范围说明

示例(以 2.2.3 为基准)

^

尖括号

锁定主版本号,允许更新次版本和修订版本

^2.2.3表示:
2.2.3≤版本< 3.0.0

~

波浪号

锁定主版本和次版本,仅允许更新修订版本

~2.2.3表示:
2.2.3≤版本< 2.3.0

*

星号

通配符,匹配所有版本

2.2.*表示:

锁定主版本 2和次版本 2,修订版本任意

>、< 、||

大于、小于、或

>2.2.3:大于2.2.3的任意版本

<2.2.3:小于2.2.3的任意版本

>2.2.3 <3.1.1:大于2.2.3且小于3.1.1的任意版本

2.2.3 || 2.3.42.2.3 或者 2.3.4版本

无符号

精确匹配

固定版本号,不允许任何更新,也叫锁版本号

2.2.3表示:

仅使用 2.2.3固定版本

明白了语义化版本号控制的规则后,我们来看看开头的 package.json文件,执行npm i,安装的react的版本号一定是19.1.1吗?

{
  "dependencies": {
    "react": "^19.1.1",
    "react-dom": "^19.1.1",
    "react-router": "~7.8.2",
    "react-scripts": "5.0.1"
  }
}

项目中用到的某个包的具体版本号,应该要去package-lock文件中找

或者去node_modules/react/package.json中找