Package.json中npm依赖版本管理

来由

近期项目中总是报Typescript版本警告,很是烦人,趁着有空,找一下原因,随之就浮现了 npm 依赖版本管理问题。

警告 ⚠️ 信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
=============

WARNING: You are currently running a version of TypeScript which is not officially supported by typescript-estree.

You may find that it works just fine, or you may not.

SUPPORTED TYPESCRIPT VERSIONS: >=3.2.1 <3.6.0

YOUR TYPESCRIPT VERSION: 3.7.4

Please only submit bug reports when using the officially supported version.

=============

Package.json 中为:

1
2
3
4
5
6
7
8
9
{
"name": "ts",
"dependencies": {
// 略
},
"devDependencies": {
"typescript": "^3.2.1"
}
}

npm 包版本格式

npm 包版本的格式为:

1
2
major.minor.patch
主版本号.次版本号.修补版本号
  • major:新的架构调整,不兼容老版本

  • minor:新增功能,兼容老版本

  • patch:修复 bug,兼容老版本

包版本的声明方式有:

  • version - 必须匹配指定版本, 如 3.2.1

  • >version - 必须大于指定版本, 如 >3.2.1

  • >=version - 可大于或等于指定版本, 如 >=3.2.1

  • <version - 必须小于指定版本, 如 <3.2.1

  • <=version - 可小于等于指定版本, 如 <=3.2.1

  • ~version - 大约匹配某个版本, 如 ~3.2.1, 如果minor版本号指定了,那么minor版本号不变,而patch版本号任意, 如果minorpatch版本号未指定,那么minorpatch版本号任意

  • ^version - 兼容某个版本, 如 ^3.2.1

    如:^1.1.2 ,表示>=1.1.2 <2.0.0,可以是 1.1.2,1.1.3,…..,1.1.n,1.2.n,…..,1.n.n
    如:^0.2.3 ,表示>=0.2.3 <0.3.0,可以是 0.2.3,0.2.4,…..,0.2.n
    如:^0.0,表示 >=0.0.0 <0.1.0,可以是 0.0.0,0.0.1,…..,0.0.n

  • x-range - x 的位置表示任意版本, 如 3.2.x

  • *-range - 任意版本,””也表示任意版本, 如 *, 表示>=0.0.0的任意版本

  • version1 - version2 - 大于等于version1,小于等于version2, 如 1.1.2 - 1.3.1, 表示包括1.1.21.3.1和它们之间的任意版本

  • range1 || range2 - 满足range1或者满足range2,可以多个范围, 如 <1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0, 表示满足这 3 个范围的版本都可以

而通常我们通过 npm install typescript/yarn add typescript命令安装的都是 ^version格式

yarn.lock/package.lock.json的作用

通过上面可知每次下载依赖的版本可能都会不同,这就造成了有时本地 build 完全没有问题,但是推到服务器或者在别人电脑上就会 build 失败。
所以 lock 文件会记录所有包的版本以及包的依赖的版本,这样就可以保证每个人下载的依赖版本都是完全相同的,从而避免很多问题。

问题及总结

结合上面的内容,大家应该看的出来,问题就出在版本声明^3.2.1中的^version格式上面,随着我们增加依赖包,或者更新项目内依赖包,且依赖有更高版本,导致Typescript3.2.1自动升级到3.7.4, 而我的跟Typescript相关的依赖却没有随之升高或暂不支持高版本,导致命令行爆出警告 ⚠️ 提示。

所以大家只有修改一下Package.jsonTypescirpt的版本格式并重新安装一下项目依赖就好了。这个问题适用于所有 npm 依赖,并且也反映出我们项目中 npm 依赖版本管理有问题,需要我们改进。

参考文档

npm semver calculator
npm 的语义版本控制程序
配置 Package.json
语义化版本