《软件更新策略实战解析》
第2章 版本号管理

2、版本号管理:语义化版本控制(SemVer)规范

📌 核心概念

语义化版本控制(SemVer,Semantic Versioning)是一种广泛采用的版本号管理规范,旨在通过清晰、可读、可预测的版本号格式,向开发者传达软件变更的兼容性信息。它解决了“依赖地狱”问题,让版本管理变得科学、透明。

🎯 版本号组成:主版本号.次版本号.修订号

MAJOR . MINOR . PATCH

示例:2.5.1 → 主版本号2,次版本号5,修订号1

MAJOR 主版本号 . MINOR 次版本号 . PATCH 修订号 版本号格式:MAJOR.MINOR.PATCH

📋 版本号递增规则

变更类型 递增部分 其他部分重置 示例
不兼容的 API 修改 主版本号 (MAJOR) +1 MINOR=0, PATCH=0 1.4.2 → 2.0.0
向下兼容的功能新增 次版本号 (MINOR) +1 PATCH=0 1.4.2 → 1.5.0
向下兼容的问题修正 修订号 (PATCH) +1 — 1.4.2 → 1.4.3
开始:当前版本 vX.Y.Z 是否兼容? (API 变更) 不兼容 MAJOR +1 MINOR=0, PATCH=0 兼容 新增功能? vs 仅修复 是 MINOR +1 PATCH=0 否(仅修复) PATCH +1 仅修订号递增 ✅ 生成新版本号

📌 特殊规则与预发布版本

  • 预发布版本:在版本号后添加连字符和标识符,如 1.0.0-alpha、2.3.1-rc.1。优先级低于正式版本。
  • 构建元数据:在版本号后添加加号和标识符,如 1.0.0+build.20240301。仅用于构建信息,不影响版本优先级。
  • 版本优先级比较:从左到右依次比较 MAJOR → MINOR → PATCH,数值大的优先级高。预发布版本优先级低于正式版本。
  • 起始版本:通常从 0.1.0 开始开发,1.0.0 标志着第一个稳定、公开的 API 版本。
0.1.0 初始开发 0.9.0 Beta 阶段 1.0.0 🎉 正式发布 1.2.0 功能新增 2.0.0 重大变更 时间

💻 代码示例:版本号比较逻辑

// 语义化版本号比较函数(JavaScript 示例)
function compareVersions(v1, v2) {
    const parts1 = v1.split('.').map(Number);
    const parts2 = v2.split('.').map(Number);

    for (let i = 0; i < 3; i++) {
        if (parts1[i] > parts2[i]) return 1;   // v1 更大
        if (parts1[i] < parts2[i]) return -1;  // v2 更大
    }
    return 0;  // 版本相等
}

// 使用示例
console.log(compareVersions('2.1.0', '1.9.9'));  // 输出: 1  (2.1.0 更大)
console.log(compareVersions('1.0.0', '1.0.0'));  // 输出: 0  (相等)
console.log(compareVersions('1.0.0', '1.0.1'));  // 输出: -1 (1.0.1 更大)

💡 最佳实践建议:

  • 在 package.json(Node.js)或 Cargo.toml(Rust)等配置文件中严格遵循 SemVer。
  • 使用 ^(兼容次版本)或 ~(兼容修订号)范围符号管理依赖版本。
  • 每次发布前,使用 semver 工具或 CI 脚本自动校验版本号递增是否符合规范。