Nodejs
成功离不开 npm
优秀的依赖管理系统。在介绍整个依赖系统之前,必须要了解 npm
如何管理依赖包的版本,本章将介绍 npm包
的版本发布规范、如何管理各种依赖包的版本以及一些关于包版本的最佳实践。
系列文章:
npm(五):组件发布npm包全流程 (使用rollup打包工具)
目录
1. 查看npm包版本
执行 npm view package version
查看某个 package
的最新版本。
执行 npm view conard versions
查看某个 package
在npm服务器上所有发布过的版本。
2. SemVer规范
npm包
中的模块版本都需要遵循 SemVer
规范——由 Github
起草的一个具有指导意义的,统一的版本号表示规则。实际上就是 Semantic Version
(语义化版本)的缩写。
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
-
发布重大版本或版本改动较大时,先发布
alpha
、beta
、rc
等先行版本
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
- 比较版本号大小
- semver.clean(' =v1.2.3 ') // '1.2.3'
- semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') //true
- semver.minVersion('>=1.0.0') // '1.0.0'
- 一些其他用法
- semver.valid(semver.coerce('v2')) // '2.0.0'
- semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
- 将其他版本号强制转换成semver版本号
- semver.valid('1.2.3') // '1.2.3'
- semver.valid('a.b.c') // null
- 判断版本号是否符合规范,返回解析后符合规范的版本号
- semver.gt('1.2.3', '9.8.7') // false
- 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。
欢迎 关注、点赞、评论!━(*`∀´*)ノ亻!