Semver

203 阅读3分钟

semver 全称叫 Semantic Version 即语义化版本

简单来说就是一个社区约定的版本号规范,目的是为了让版本号更加语义化,更加见名知意

格式为

MAJOR.MINOR.PATCH-PRERELEASE+BUILD
部分说明是否必选
MAJOR主版本号,破坏兼容性更新必选
MINOR次版本号,向前兼容新增功能必选
PATCH修订号,仅修复 bug必选
PRERELEASE预发布标识(alpha/beta/rc 等)可选
BUILD构建元数据(时间戳/哈希等)可选,基本不用

SEMVER

先行版本

可以在版本号后加 - 和标识符,表示预发布版本

预发布版本的优先级低于同一正式版本。

其中标识符是可以自定义的,并没有严格规定。

  • 命名格式 ⇒ 必须由 ASCII 字母、数字和连字符([0-9A-Za-z-])组成,不能留空
  • 多个标识符可以用.分隔,如:1.0.0-alpha.1

社区一般流行以下几种标识符

  • alpha(阿尔法,内测版,功能不全,可能不稳定)
  • beta(测试版,功能较全,可能有 bug)
  • rc(Release Candidate,候选发布版,接近正式版)
  • dev(开发版)
  • preview(预览版)

版本优先级

  1. 从左到右依次比较:MAJOR → MINOR → PATCH
  2. 遇到不一样的数字就结束比较,直接决定大小。

因此对应优先级从高到低依次为:

  1. MAJOR
  2. MINOR
  3. PATCH
  4. Pre-release

相同版本的不同预发布版本比较规则

  • 顺序从左到右,一一对应比较。

  • 数值字符串分开比较。

    • 数字 < 字母(数字优先级更低)
    • 数字:按数值大小比(比如 1 < 2
    • 字母:按 ASCII 字典序比(比如 alpha < beta
    • 如果一方有更多标识符(比如 alpha.1 vs alpha),短的优先级低alpha < alpha.1

例子:

  • 1.0.0 > 1.0.0-beta
  • 2.1.0 > 2.0.5
  • 1.2.3 > 1.2.3-alpha.1
  • 1.2.0-beta.2 > 1.2.0-alpha.2

版本约束范围

  • ^1.2.3:兼容 1.x.x 版本,但 <2.0.0 ⇒ 锁大版本
  • ~1.2.3:兼容 1.2.x 版本,但 <1.3.0 ⇒ 锁大版本和 minor版本

npm version

npm version <version> 会执行

  1. 根据需求自动递增 package.jsonversion 字段
  2. 使用 git tag 命令打上对应的标签
类型作用说明举例后版本号变化
(假设原为 1.2.3)
patch修订号 +11.2.4
minor次版本号 +1,修订号归01.3.0
major主版本号 +1,次/修订号归02.0.0
prerelease预发布号 +11.2.4-0(或 1.2.4-1
prepatch进入下一个 patch 的预发布版1.2.4-0
preminor进入下一个 minor 的预发布版1.3.0-0
premajor进入下一个 major 的预发布版2.0.0-0
1.2.5直接指定版本号1.2.5

prepatchpreminorpremajor 是直接在对应版本号后边直接加上-0

prerelease

  1. 如果没有预发布版本,则加上 -0
  2. 否则在原有预发布版本号基础上 加 1

可以通过preid 指定对应的预发布标识 (如 alphabetarc

# 假如原版本是 v1.0.1 执行命令后是 v1.0.1-beta.0
# 假如原版本是 v1.0.1-alpha.1 或者 v1.0.1-1 执行命令后都是 v1.0.1-beta.0
#  => 重置 preid 并把编号从 0 开始
npm version prerelease --preid=beta

我们也可以通过-m 来指定版本注释信息

# 注释信息中可以使用 %s 直接表示新版本号 => 注意版本号是不带v的
npm version major -m "Release version %s"
# 版本号注释信息可能是 Release version 2.0.0