package.json 依赖项中,经常能看到 ^8.0.33, ~0.7.1 之类的版本号,比如 vue/package.jsonwebpack/package.json。 开头的 ^, ~ 是什么含义?

要理解这些符号,要从语义化版本说起。

语义化版本 semantic versioning

软件开发过程中难免需要依赖第三方库。一般我们都希望使用最新的第三方库,因为新版会修复旧版 bug,并增加新特性。但新版本也可能与旧版本不兼容。

如何既能使用新版本,又能保持与旧版的兼容性呢?语义化版本提出了一种解决思路。

在语义化版本中,版本号划分为三个粒度:MAJOR.MINOR.PATCH,可以分别称为大版本、小版本和修复版本。

  • 如果只是修复了上一个版本的 bug,新版本只需要增加 PATCH 版本号即可,发行修复版本更新。
  • 如果新增了特性,但是与上版本兼容,可以增加 MINOR 版本号,发行小版本更新。
  • 如果引入的新特性与上版本不兼容,需要增加 MAJOR,发行大版本更新。

如果库文件开发者和使用者都遵循语义化版本,就可以在保持兼容性的前提下,使用最新的版本。

npm 作者 Issac Z. Schlueter 开发了 semver,专门用来处理语义化版本号。

semver

semver 使用了一些符号来表示版本范围,基本运算符如下:

  • < 小于某版本
  • <= 不大于某版本
  • > 大于某个版本
  • >= 不小于某版本
  • = 等于某版本

除了基本运算符,还可以使用空格连接两个版本号,表示一个版本集合,比如:>=1.2.7 <1.3.0

还可以使用 || 连接多个集合,形成一个版本范围,比如:1.2.7 || >=1.2.9 <2.0.0

高级范围语法

连字符范围 -

  • X.Y.Z - A.B.C 等价于 >=X.Y.Z <=A.B.C

X 范围

  • * 等价于 >=0.0.0,即所有版本
  • 1.x 等价于 >=1.0.0 <2.0.0
  • 1.2.x 等价于 >=1.2.0 <1.3.0

波浪线范围 ~,是修复级别的版本范围

  • ~1.2.3 等价于 >=1.2.3 <1.3.0

插入符范围 ^,是小版本的范围

  • ^1.2.3 等价于 >=1.2.3 <2.0.0

所以,^, ~, * 是控制不同版本范围的粒度。

REF