SemVer学习

semver是一种语义化版本。

相当于一种格式的规范,在我们的package.json里面,以及github repo tag是常见的。

版本号递增规则

主版本号:当做了不兼容的API修改

次版本号:当做了向下兼容的功能性新增,相当于是feature的发布。

修订号: 当你做了向下兼容的问题修正。

semver 规范

使用语义化版本控制的软件必须定义公共API。精确且完整

标准版本号必须采用XYZ的格式,XYZ都为非负证书,且不可以在数字前补零。X是主版本号、Y是次版本号、Z是修订号

1.9.1 => 1.10.0 => 1.11.0

标记版本号软件发行后,禁止改变该版本内容,以后的修改必须要以新版本发型。

主版本为0表示在开发初期,随时都可以改变,这样的公共API不应该被视为稳定版

1.0.0的版本用于界定公共API的形成。

修订号 Z(x.y.Z | x > 0)“必须 MUST ”在只做了向下兼容的修正时才递增。这里的修正指的是针对不正确结果而进行的内部修改。

次版本号 Y(x.Y.z | x > 0)“必须 MUST ”在有向下兼容的新功能出现时递增。在任何公共 API 的功能被标记为弃用时也“必须 MUST ”递增。也“可以 MAY ”在内部程序有大量新功能或改进被加入时递增,其中“可以 MAY ”包括修订级别的改变。每当次版本号递增时,修订号“必须 MUST ”归零。

主版本号 X(X.y.z | X > 0)“必须 MUST ”在有任何不兼容的修改被加入公共 API 时递增。其中“可以 MAY ”包括次版本号及修订级别的改变。每当主版本号递增时,次版本号和修订号“必须 MUST ”归零。

先行版本号“可以 MAY ”被标注在修订版之后,先加上一个连接号再加上一连串以句点分隔的标识符号来修饰。标识符号“必须 MUST ”由 ASCII 码的英数字和连接号 [0-9A-Za-z-] 组成,且“禁止 MUST NOT ”留白。数字型的标识符号“禁止 MUST NOT ”在前方补零。先行版的优先级低于相关联的标准版本。被标上先行版本号则表示这个版本并非稳定而且可能无法达到兼容的需求。范例:1.0.0-alpha、1.0.0-alpha.1、1.0.0-0.3.7、1.0.0-x.7.z.92。

版本编译信息“可以 MAY ”被标注在修订版或先行版本号之后,先加上一个加号再加上一连串以句点分隔的标识符号来修饰。标识符号“必须 MUST ”由 ASCII 的英数字和连接号 [0-9A-Za-z-] 组成,且“禁止 MUST NOT ”留白。当判断版本的优先层级时,版本编译信息“可 SHOULD ”被忽略。因此当两个版本只有在版本编译信息有差别时,属于相同的优先层级。范例:1.0.0-alpha+001、1.0.0+20130313144700、1.0.0-beta+exp.sha.5114f85。

版本的优先层级指的是不同版本在排序时如何比较。判断优先层级时,“必须 MUST ”把版本依序拆分为主版本号、次版本号、修订号及先行版本号后进行比较(版本编译信息不在这份比较的列表中)。由左到右依序比较每个标识符号,第一个差异值用来决定优先层级:主版本号、次版本号及修订号以数值比较,例如:1.0.0 < 2.0.0 < 2.1.0 < 2.1.1。当主版本号、次版本号及修订号都相同时,改以优先层级比较低的先行版本号决定。例如:1.0.0-alpha < 1.0.0。有相同主版本号、次版本号及修订号的两个先行版本号,其优先层级“必须 MUST ”透过由左到右的每个被句点分隔的标识符号来比较,直到找到一个差异值后决定:只有数字的标识符号以数值高低比较,有字母或连接号时则逐字以 ASCII 的排序来比较。数字的标识符号比非数字的标识符号优先层级低。若开头的标识符号都相同时,栏位比较多的先行版本号优先层级比较高。范例:1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0- rc.1 < 1.0.0。


npm 包管理遵从semver规则

当我们例如install一个软件包,例如

"koa": "^2.7.0"

^指代我们遵循发布的小版本兼容

如果上游版本号现在为2.9.0
我们npm install的时候也会使用2.9.0

而当包管理为

"koa": "~2.5.0"

我们获取上游包版本则为2.5.0 , 2.5.x

总结而言 项目依赖管理有三种

修订号:~16.2.0、16.2.x、16.2
次版本发布:^16.2.0、16.x、16
主版本号:*、x


而当我们管理自己的npm package发布的时候。

  1. 手动进行项目发布

修改package.json版本号
npm publish 发布

  1. 使用npm脚本命令
修订号:npm version patch
次版本发布:npm version minor
主版本号:npm version major

同时我们还可以利用dist-tags

来给我们的包指定latest. next等tags
从而使我们更灵活使用包管理

npm i koa@latest
npm i koa@next

当执行 npm publish 时,会首先将当前版本发布到 npm registry,然后更新 dist-tags.latest 的值为新版本。

当执行 npm publish –tag=next 时,会首先将当前版本发布到 npm registry,并且更新 dist-tags.next 的值为新版本。
next也许是某个指定的版本号(eg: xx.xx.x-beta.2)

{
  dist-tags: {
    latest: 'xx.xx.xx'
    next: 'xx.xx.x-beta.2'
  }
}

绝大部分内容摘且学习自 https://semver.org/lang/zh-CN/spec/v2.0.0.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注