NPM 包先行版本号 pre-release version 介绍

1,801 阅读4分钟

image.png

NPM 包发布大家应该都会,npm-publish就完事了,但发包之前肯定需要填写版本,如何优雅的定义版本呢,本文带你来了解下~

定义个版本还优雅,我直接 package.json 里面第 3 位版本加 1 就完事了,如果这次改动很小,并且自测充分,保证不会出问题,那么直接加 1 是可行的,但改动较大,还是需要定义 alpha 或 beta 等先行版本进行测试的。如 vue 的版本定义:

image.png

这里它还没有发布 3.3.0 版本,3.3.0-alpha 等都是先行版本号(pre-release version),正常的 npm install 是不会安装这些版本的,除非你特意指定。

在继续之前,我们需要了解下 语义化版本

版本格式:主版本号.次版本号.修订号(MAJOR.MINOR.PATCH)本号递增规则如下:

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

先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。

链接 API 里面有对语义化版本所有知识详细的描述,推荐仔细看下,如:

主版本号为零(0.y.z)的软件处于开发初始阶段,一切都可能随时被改变。这样的公共 不应该被视为稳定版。

主版本号 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。

版本的优先层级指的是不同版本在排序时如何比较。

  1. 判断优先层级时,必须(MUST)把版本依序拆分为主版本号、次版本号、修订号及先行版本号后进行比较(版本编译信息不在这份比较的列表中)。

  2. 由左到右依序比较每个标识符,第一个差异值用来决定优先层级:主版本号、次版本号及修订号以数值比较。

    例如:1.0.0 < 2.0.0 < 2.1.0 < 2.1.1。

  3. 当主版本号、次版本号及修订号都相同时,改以优先层级比较低的先行版本号决定。

    例如:1.0.0-alpha < 1.0.0。

  4. 有相同主版本号、次版本号及修订号的两个先行版本号,其优先层级必须(MUST)透过由左到右的每个被句点分隔的标识符来比较,直到找到一个差异值后决定:

    1. 只有数字的标识符以数值高低比较。
    2. 有字母或连接号时则逐字以 ASCII 的排序来比较。
    3. 数字的标识符比非数字的标识符优先层级低。
    4. 若开头的标识符都相同时,栏位比较多的先行版本号优先层级比较高。

    例如: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。

以上是先行版本号(pre-release version)的定义,那么在修改版本时难道我们要傻傻的去手动修改 package.json 中的 version 字段吗?(而且手动改还容易出错,比如增加了次版本号,但是忘了把修订号改为零)不用的,npm cli 提供了 version 命令来帮助我们执行此操作:

npm version 1.2.3
# 给当前包的版本设置为 1.2.3

npm version patch
# 修订号升级:v1.2.4

npm version minor
# 次版本号升级:v1.3.0

npm version major
# 主版本号升级:v2.0.0

请注意:使用 npm version 命令会自动使用 git commit 并且打 tag,所以你要保证使用此命令时 git 缓存区为空。

npm version 还可以创建先行版本号,如下示例:

如果您使用的是版本  1.0.0 ,并且想转到  1.1.0-beta.0 ,则可以使用 preminor 命令。除了 preminor,还有 premajor 和 prepatch。您可以使用  --preid=beta (或您想要的标识符,例如  alpha 、 beta  或  rc )来标记您的预发布。

# this will take you to 2.0.0-rc.0
npm version premajor --preid=rc

# this will take you to 1.1.0-beta.0
npm version preminor --preid=beta

# this will take you to 1.0.1-alpha.0
npm version prepatch --preid=alpha

假设您决定更新到预发布版本,那么您的应用现在位于  v1.1.0-beta.0 ,您可以使用 prerelease 命令发布后续预发布版本。

# this will take you to 1.1.0-beta.1
npm version prerelease

# and again will take you to 1.1.0-beta.2
npm version prerelease

# and again will take you to 1.1.0-beta.3 and so on
npm version prerelease

一旦您准备好使次要版本正式化,根据您的开始,您将需要更新命令以匹配。在我们的例子中,我们使用了  npm version preminor ,所以切换到版本的命令是  npm version minor 。

# from 2.0.0-rc.1 to 2.0.0
npm version major

# from 1.1.0-beta.0 to 1.1.0
npm version minor

# from 1.0.1-alpha.0 to 1.0.1
npm version patch

好了,定义先行版本号和发布算是完事了,但其他人如何安装你的先行版本号的包呢?

这就要说到 dist-tag,你要知道,你在平时安装一个包时,他都是有 dist-tag 属性的,即 npm install <name>@<dist-tag>,如安装 vue

npm install vue

npm install vue@latest

# 这两种方式是一样的,只不过第一种省略了 dist-tag 即 latest

那 vue 包有多少个 dist-tag 呢?可以在包的首页查看:

image.png

还可以使用命令行:

npm dist-tag ls vue

# 输出:
# alpha: 3.3.0-alpha.13
# beta: 3.2.34-beta.1
# csp: 1.0.28-csp
# latest: 3.2.47
# legacy: 2.6.14
# next: 3.2.36
# v2-alpha: 2.7.0-alpha.12
# v2-beta: 2.7.0-beta.8
# v2-latest: 2.7.14

所以你可以手动安装 beta 这个 tag 的包:

npm install vue@beta

# 这会安装 3.2.34-beta.1 版本

那么只要在发布版本时,定义好这些 dist-tag 即可,用户就可以通过npm install <name>@<dist-tag>的方式安装你的 beta 包了

如何定义 dist-tag?可在发布时增加参数,如npm publish --tag beta,或使用npm dist-tag命令管理 dist-tag,dist-tag 相较于版本来说更灵活,可以增加删除修改,版本如果出现问题就不能删除,只能通过出一个新版本解决。

参考:How to use npm version to create prerelease tagsWhat are NPM dist tags and how to use them