乐趣区

关于前端:聊聊-npm-的语义化版本Semver

前言

当初咱们要开发一个我的项目,咱们都晓得为了不便项目管理,要写一个版本号,那开发的时候初始的版本号是多少呢?是 1.0.0 还是 0.0.1 开始?

如果一个版本号为 X.Y.Z,什么时候是 X 应该加 1,什么时候 Y 应该加 1,什么时候 Z 应该加 1,加 1 遵循十进制吗?比方 1.0.9 的下一个版本应该是 1.1.0 吗?

咱们常常看到一些我的项目的版本还带着后缀,比方 React 的 18.0.0-rc.3、Vue 的 2.7.0-alpha.12,这些又是什么意思呢?这些后缀是固定字段还是能够自定义的呢?

SemVer 标准

实际上,语义化的版本控制并不是一个创新性的想法,即使咱们不晓得这些,咱们也在做相似的事件,但一个明确的标准将会让版本逻辑更清晰的传播给其余开发者。

所以由 Gravatars 创办者兼 GitHub 独特创办者 Tom Preston-Werner 就建设了语义化版本控制的标准,semantic version 简称 semver,于是这个标准就叫做 SemVer 标准,标准地址为:https://semver.org/lang/zh-CN/

我简略讲讲其中的内容,大家也很容易了解:

版本号的格局

规范的版本号必须采纳 X.Y.Z 的格局 ,其中 X、Y 和 Z 为非负的整数,且禁止在数字后方补零。X 是主版本号、Y 是次版本号、而 Z 为订正号,英文对应示意为 major、minor、patch,每个元素必须以数值来递增。例如:1.9.1 -> 1.10.0 -> 1.11.0。

主版本号为零(0.y.z)的软件处于开发初始阶段,所有都可能随时被扭转。

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

版本号的递增逻辑

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

次版本号 Y(x.Y.z | x > 0)必须在有向下兼容的新性能呈现时递增。在任何公共 API 的性能被标记为弃用时也必须递增。也能够在外部程序有大量新性能或改良被退出时递增,其中能够包含订正级别的扭转。每当次版本号递增时,订正号必须归零。

主版本号 X(X.y.z | X > 0)必须在有任何不兼容的批改被退出公共 API 时递增。其中能够包含次版本号及订正级别的扭转。每当主版本号递增时,次版本号和订正号必须归零。

简略的总结下就是:

  1. 当有不兼容的 API 更改时,则降级主版本号
  2. 当以向后兼容的形式增加性能时,则降级次版本号
  3. 当进行向后兼容的缺点修复时,则降级订正号

对于后行版本

后行版本号能够被标注在修订版之后,先加上一个连接号再加上一连串以句点分隔的标识符来润饰。标识符必须由 ASCII 字母数字和连接号组成,且禁止留白。数字型的标识符禁止在后方补零,举个例子:1.0.0-alpha.6

后行版的优先级低于相关联的规范版本,举个例子 1.0.0-alpha < 1.0.0

被标上后行版本号则示意这个版本并非稳固而且可能无奈满足预期的兼容性需要。

问题答复

其实标准内容并不多,回到结尾时的第一个问题:

Q:在 0.y.z 初始开发阶段,我该如何进行版本控制?
A:最简略的做法是以 0.1.0 作为你的初始化开发版本,并在后续的每次发行时递增次版本号。

Q:如何判断公布 1.0.0 版本的机会?
A:当你的软件被用于正式环境,它应该曾经达到了 1.0.0 版。如果你曾经有个稳固的 API 被使用者依赖,也会是 1.0.0 版。如果你很放心向下兼容的问题,也应该算是 1.0.0 版了。

alpha beta 和 rc

当初咱们晓得,后行版本中 - 后的字符是自定义的,咱们常常看到一些库的版本会带 alpha、beta 之类的字样,就以 Vue 为例,有 3.0.0-alpha.133.0.0-beta.13.0.0-rc.1,这些示意什么意思呢?

一般来说:

alpha 示意外部测试版,次要给开发和测试找 bug 用,不倡议用户下载
beta 示意公开测试版,你能够提前尝试一些性能
rc 是 Release Candidate(候选版本)的缩写,示意该版本性能不再减少,和最终公布版性能一样,有点像预览版,而后可能再改改一些小 bug,就会到正式的版本了。

当然库也能够应用本人的版本逻辑,就比方 React,它还有 next 版和 experimental 版,具体的公布逻辑 React 官网也有写:https://react.docschina.org/docs/release-channels.html

npm 指定版本范畴

咱们常常在 package.json 文件中看到版本号前呈现 ~ ^ 等字符,比方:

{
   "dependencies": {"react": "^1.2.3"vue":"~1.2.3",}
}

这些标识符的作用置信咱们多少都晓得一点,比方:

^ 示意次版本号的更新,比方 ^1.2.3 就示意当前装置的版本 >=1.2.3 <2.0.0
~ 示意订正版本号的更新,比方 ~1.2.3 就示意当前装置的版本 >=1.2.3 <1.3.0

当然具体的逻辑会更简单一点,比方:

^ 只会执行不更改最右边非零数字的更新,所以:

  1. ^0.2.3 相当于 >=1.2.3 <2.0.0
  2. ^0.0.3 相当于 >=0.0.3 <0.0.4
  3. ^1.2.3-beta.2 相当于 >=1.2.3-beta.2 <2.0.0,这其中 1.2.3-beta.4 是能够的,但 1.2.4-beta.2 就不行了

    ~ 如果指定了次版本号,则会只进行订正版本号的更新,如果没有指定,则会进行此版本号的更新,所以:

  4. ~1.2.3 相当于 >=1.2.3 <1.3.0
  5. ~1.2 相当于 >=1.2.0 <1.3.0 (相当于 1.2.x)
  6. ~1 相当于 >=1.0.0 <2.0.0 (相当于 1.x)
  7. ~1.2.3-beta.2 相当于 >=1.2.3-beta.2 <1.3.0,这其中 1.2.3-beta.4 是能够的,但 1.2.4-beta.2 就不行了

除了 ^~,NPM 提供了更多的示意范畴版本的形式:https://docs.npmjs.com/cli/v8/configuring-npm/package-json#dependencies

简略举几个示例:

{
  "dependencies": {
    "foo": "1.0.0 - 2.9999.9999",
    "bar": ">=1.0.2 <2.1.2",
    "baz": ">1.0.2 <=2.3.4",
    "qux": "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0",
    "lat": "latest",
  }
}

这其中 latest 示意标签,在默认状况下,npm 应用 latest 标签来标识软件包的以后版本。

对应咱们安装包的时候也能够参照这些指定版本装置:

npm install foo@1.2.3
npm install foo@">=0.1.0 <0.2.0"
npm install foo@latest

npm version

NPM 也提供了 npm version 命令能够更新版本号,具体的语法如下:

npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease | from-git]

其中最次要的就是 majorminorpatch,比方你当下的我的项目的 package.jsonversion1.0.0

当你执行 npm version major 后,version 会变成 2.0.0
当你执行 npm version minor 后,version 会变成 1.1.0
当你执行 npm version patch 后,version 会变成 1.0.1

premajorpreminorprepatch 也是同理:

当你执行 npm version premajor 后,version 会变成 2.0.0-0
当你执行 npm version premajor 后,version 会变成 1.1.0-0
当你执行 npm version prepatch 后,version 会变成 1.0.1-0

而当你执行 npm version prerelease 后,version 也会变成 1.0.1-0

prepatchprerelase 的区别在于,prepatch 是减少 patch 号,后行版本号置为 0,prerelase 则是如果没有后行版本号,则跟 prepatch 一样,如果有的话,则会在后行版本号上加 1,举个例子,当你的版本号为 1.0.0-0 时,

当你执行 npm version prepatch 后,version 会变成 1.0.1-0
而当你执行 npm version prerelease 后,version 会变成 1.0.0-1

你也能够在此基础上再增加一个 -m 参数:

npm version patch -m "Upgrade to %s for reasons"

其中 %s 示意新的版本号,npm 会创立一个 commit 信息,就相当于 npm 批改了版本号后,又对文件执行了一句 git commit -am "Upgrade to %s for reasons"

更多 npm version 命令能够参考 npm 官网文档 https://docs.npmjs.com/cli/v8/commands/npm-version

系列文章

冴羽答读者问全目录:https://github.com/mqyqingfen…

如果喜爱或者有所启发,欢送 star,对作者也是一种激励。

退出移动版