语义化版本 Semantic Versioning

2,435 阅读3分钟
之前对语义化版本只有一个概念,大概了解是用某个规则对软件包的版本进行控制,约束和规范公共API的版本迭代。对于具体规则的其实是不清楚细节的。当自己在公司内部发布或维护某些包的时候,版本定义也很随意,对使用者来说是挖了一个大坑,痛定思痛,研究一波。


简介

为了解决软件管理领域的“依赖地狱“,制定的一套系统被称为语义化的版本控制,在这套约定下,版本号及其更新方式包含了相邻版本间的底层代码和修改内容的信息。

是由 Gravatars 创办者兼 GitHub 共同创办者 Tom Preston-Werner 所建立。

可分为正式版和先行版两个大类

正式版本格式

主版本号.次版本号.修订号,X.Y.Z 版本号递增规则如下:

  1. 主版本号:当你做了不兼容的 API 修改
  2. 次版本号:当你做了向下兼容的功能性新增
  3. 修订号:当你做了向下兼容的问题修正

X、Y和Z为非负的整数;如1.0.0 -> 1.0.1 -> 1.1.0,禁止前方补0,比如01.0.0是不符合规范的

先行版本格式

在发布大版本或者核心feature前,会发布先行版本进行测试。主要有3种格式

  1. alpha:内部测试版
  2. beta:公测版
  3. rc:release candiate,正式版本的候选版

先行版本号可以加到“主版本号.次版本号.修订号”的后面,作为延伸。以-连接符加上一连串以.分隔的标识符来修饰。例如1.0.0-alpha.1、1.0.0-beta.2、1.2.0-rc.0,最后一位是次数信息

升级指南

  • 第一个正式版本从1.0.0开始
  • 1.0.0发布的时机:当你的软件被用于正式环境,它应该已经达到了 1.0.0 版。如果你已经有个稳定的 API 被使用者依赖,也会是 1.0.0 版。如果你很担心向下兼容的问题,也应该算是 1.0.0 版了。
  • 当主版本号升级时,次版本号和修订号归零;当次版本号升级时,修订号归零


npm semver

semver 是 由npm团队对 语义化版本(Semantic Versioning)规范 的一个实现,实现了版本和版本范围的解析、计算、比较。

  • 固定版本:是指例如 0.2.0、2.2.3、2.1.4-rc.1这样的特定版本。
  • 范围版本:是对满足规则的版本的一种表示,例如 1.2.3 - 2.3.4、1.x、^0.2.1、~1.2.1、 >1.4

npm中的版本号匹配规则

在npm的依赖规则中,主要有^、~、>、<、>=、<=、 - 、||、x、*这几种

当执行npm install xxx时,默认会在被安装依赖的版本号前加上^

  • ^ :表示同一主版本号中,不小于指定版本的版本号,即固定主版本号,例如目前发布的版本有2.0.0和1.9.0,^1.1.3对应安装的版本将是1.9.0
  • ~:表示同一主次版本号中,不小于指定版本的版本号,即固定主次版本号,例如^1.1.3会匹配到1.1.3、1.1.4、1.1.5,而2.0.0、1.2.0是不会匹配的
  • >、<、>=、<=、 - :指定一个范围,例如 >1.0.0会匹配到1.0.0、1.1.2、2.2.3,而不会匹配0.1.2、0.9.2,其中要注意的是1.1.0 - 2.2.0,"-"两边都是有空格的。
  • || :表示或 0.0.1 || 0.3.0 - 15.5.0 会匹配到0.01、0.3.0、0.3.1 ... 14.5.2、15.5.0,而不会匹配到0.2.2、0.1.2
  • *、x:表示通配符 * 对应所有版本号,2.x对应所有主版本为2的版本号

先行版本号的匹配规则

如果指定版本号不是先行版本号,那么将不会匹配所有先行版本号的版本。如果指定版本号是先行版本号,则会匹配满足条件的先行版本号

例如^15.3.0-rc.2可以匹配到

  • 15.3.0-rc.2
  • 15.3.0-rc.3
  • 15.3.0
  • 15.3.1
  • 15.5.3

而不会匹配到

  • 15.3.0-rc.1
  • 16.1.0-rc.3
  • 15.3.0-beta.4



参考文档