npm(四):剖析npm包版本管理机制

Nodejs成功离不开 npm 优秀的依赖管理系统。在介绍整个依赖系统之前,必须要了解 npm如何管理依赖包的版本,本章将介绍 npm包 的版本发布规范、如何管理各种依赖包的版本以及一些关于包版本的最佳实践。

系列文章:

npm(一):从npm CLI说起

npm(二):剖析 package.json

npm(三):npm包发布、更新、废弃

npm(四):剖析npm包版本管理机制

npm(五):组件发布npm包全流程 (使用rollup打包工具)

npm(六):使用Vue CLI构建 lib 发布npm包

剖析npm依赖管理


目录

1. 查看npm包版本

2. SemVer规范

2.1 标准版本

2.2 先行版本

2.3 发布版本

3. 版本工具使用

4 依赖版本管理


1. 查看npm包版本

执行 npm view package version 查看某个 package 的最新版本。

执行 npm view conard versions 查看某个 package 在npm服务器上所有发布过的版本。

2. SemVer规范

npm包 中的模块版本都需要遵循 SemVer规范——由 Github 起草的一个具有指导意义的,统一的版本号表示规则。实际上就是 Semantic Version(语义化版本)的缩写。 

 SemVer规范官网:Semantic Versioning 2.0.0 | Semantic Versioning

2.1 标准版本

SemVer规范的标准版本号采用 X.Y.Z 的格式,其中 X、Y 和 Z 为非负的整数,且禁止在数字前方补零。X 是主版本号、Y 是次版本号、而 Z 为修订号。每个元素必须以数值来递增。

  • 主版本号(major):当你做了不兼容的API 修改

  • 次版本号(minor):当你做了向下兼容的功能性新增

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

例如:1.9.1 -> 1.10.0 -> 1.11.0

2.2 先行版本

当某个版本改动比较大、并非稳定而且可能无法满足预期的兼容性需求时,你可能要先发布一个先行版本。

我们可以给这个不稳定的版本贴上标签beta,因为一般 npm install 的版本都是@latest

先行版本号可以加到“主版本号.次版本号.修订号”的后面,先加上一个连接号“-”再加上一连串以句点分隔的标识符和版本编译信息。

  • 内部版本(alpha):如1.0.0-alpha.1

  • 公测版本(beta):如1.0.0-beta.1

  • 正式版本的候选版本rc: 即 Release candiate,如1.0.0-rc.1

方式:

1. 你可以运行 npm version 3.1.0-beta.0 来更新package.json,同时创建一个git标签 (请参考 version | npm 中文文档);或手动修改package.json 中version字段为3.1.0-beta.0

2. npm publish --tag beta|alpha

下面我们来看看 React 的历史版本:

 可见是严格按照 SemVer 规范来发版的:

  • 版本号严格按照 主版本号.次版本号.修订号 格式命名

  • 版本是严格递增的:16.1.0 -> 16.1.1 -> 16.2.0

  • 发布重大版本或版本改动较大时,先发布alphabetarc等先行版本

2.3 发布版本

在修改 npm 包某些功能后通常需要发布一个新的版本,我们通常的做法是直接去修改 package.json 到指定版本。如果操作失误,很容易造成版本号混乱,我们可以借助符合 Semver 规范的命令来完成这一操作:

命令 作用 执行结果version
npm version prerelease 升级预发布号

首次执行

1.0.0 -> 1.0.0-0

再次执行

1.0.0 -> 1.0.0-1

npm version prepatch 升级修订号,保留预发布号 1.0.0-1 -> 1.0.1-0
npm version preminor 升级次版本号,保留预发布号 1.0.1-0 -> 1.1.0-0
npm version premajor 升级主版本号,保留预发布号 1.1.0-0 -> 2.0.0-0
npm version patch 升级修订号

首次执行

2.0.0-0 -> 2.0.0

再次执行

2.0.0 -> 2.0.1

npm version minor 升级次版本号 2.0.1 -> 2.1.0
npm version major 升级主版本号 2.1.0 -> 3.0.0

3. 版本工具使用

在开发中肯定少不了对一些版本号的操作,如果这些版本号符合 SemVer规范 ,我们可以借助用于操作版本的npm包semver来帮助我们进行比较版本大小、提取版本信息等操作。

Npm 也使用了该工具来处理版本相关的工作。

$ npm install semver
  • 比较版本号大小
  1. semver.clean(' =v1.2.3 ') // '1.2.3'
  2. semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') //true
  3. semver.minVersion('>=1.0.0') // '1.0.0'
  • 一些其他用法
  1. semver.valid(semver.coerce('v2')) // '2.0.0'
  2. semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
  • 将其他版本号强制转换成semver版本号
  1. semver.valid('1.2.3') // '1.2.3'
  2. semver.valid('a.b.c') // null
  • 判断版本号是否符合规范,返回解析后符合规范的版本号
  1. semver.gt('1.2.3', '9.8.7') // false
  2. semver.lt('1.2.3', '9.8.7') // true

以上都是semver最常见的用法,更多详细内容可以查看 semver文档:

GitHub - npm/node-semver: The semver parser for node (the one npm uses)

4 依赖版本管理

我们经常看到,在 package.json 中各种依赖的不同写法:


	"dependencies": {
		"signale": "1.4.0",
		"figlet": "*",
		"react": "16.x",
		"table": "~5.4.6",
		"yargs": "^14.0.0"
	},

前面三个很容易理解:

  • "signale": "1.4.0": 固定版本号
  • "figlet": "*": 任意版本(>=0.0.0)
  • "react": "16.x": 匹配主要版本(>=16.0.0 <17.0.0)
  • "react": "16.3.x": 匹配主要版本和次要版本(>=16.3.0 <16.4.0)

再来看看后面两个,版本号中引用了 ~ 和 ^ 符号:

  • ~: 当安装依赖时获取到有新版本时,安装到 x.y.z 中 z 的最新的版本。即保持主版本号、次版本号不变的情况下,保持修订号的最新版本。
  • ^: 当安装依赖时获取到有新版本时,安装到 x.y.z 中 y 和 z 都为最新版本。即保持主版本号不变的情况下,保持次版本号、修订版本号为最新版本。

在 package.json 文件中最常见的应该是 "yargs": "^14.0.0" 这种格式的 依赖, 因为我们在使用 npm install package 安装包时,npm 默认安装当前最新版本,然后在所安装的版本号前加 ^ 号。

注意,当主版本号为 0 的情况,会被认为是一个不稳定版本,情况与上面不同:

  • 主版本号和次版本号都为 0: ^0.0.z、~0.0.z 都被当作固定版本,安装依赖时均不会发生变化。
  • 主版本号为 0: ^0.y.z 表现和 ~0.y.z 相同,只保持修订号为最新版本。三、个人技术提升

1.0.0 的版本号用于界定公共 API。当你的软件发布到了正式环境,或者有稳定的API时,就可以发布1.0.0版本了。所以,当你决定对外部发布一个正式版本的npm包时,把它的版本标为1.0.0。

欢迎 关注、点赞、评论!━(*`∀´*)ノ亻!

おすすめ

転載: blog.csdn.net/qq_41887214/article/details/120471739