执行yarn install报错如下:
commander@12.1.0: The engine "node" is incompatible with this module. Expected version ">18". Got "16.17.1"
通过网上搜索初步定位问题为mockjs导致的报错。
mockjs版本如下: mockjs: 1.0.1-beta3
验证是否是mockjs导致的报错
验证方式:package.json文件删除掉mockjs依赖后,再执行yarn install。
验证结果:删除mockjs依赖后,yarn install执行正常。
查看mockjs源码,commander依赖版本为*
解决办法
在package.json文件中增加如下配置:
"resolutions": {
"commander": "^2.17.1"
}
知识延伸:依赖的版本
yarn 语义版本控制
Yarn 中的包遵循语义版本控制,也称为"semver"。当你从注册表安装新软件包时,它将使用semver版本范围添加到你的package.json中。
这边版本分为major.minor.patch,看起来像以下之一:3.14.1、0.42.0、2.7.8。版本的每个部分都会在不同的时间递增:
- 当你对包的API进行破坏性或不兼容的更改时,增加
major。 - 添加新功能时增加
minor,同时保持向后兼容。 - 当你修复错误并保持向后兼容时增加
patch。
⚠️注意:有时,semver格式也有“labels”或“extensions”,用于标记预发布或测试版等内容(例如2.0.0-beta.3)
当开发者谈论两个semver版本彼此为“compatible”时,他们指的是向后兼容的更改(minor和patch)。
版本范围
当你想要指定依赖时,你可以在package.json中指定其名称和版本范围,如下所示:
{
"dependencies": {
"package-1": ">=2.0.0 <3.1.4",
"package-2": "^0.4.2",
"package-3": "~2.7.1"
}
}
字符>=、<、^和~是运算符,它们用于指定版本范围。
版本范围的目的是指定依赖的哪些版本适用于你的代码。
比较器
<、<=、>、>=、=
交集
比较器可以通过 空格 连接来创建比较器集。如 >=2.0.0 <3.1.4 。
联合
|| 连接在一起的多个比较器组的联合,如 <2.0.2 || >3.1.4。
波形符范围
- 使用指定次要版本的
~允许patch更改。 - 使用指定主要版本的
~允许minor更改。
| 版本范围 | 扩展版本范围 |
|---|---|
~3.1.4 | >=3.1.4 <3.2.0 |
~3.1 | 3.1.x 或 >=3.1.0 <3.2.0 |
~3 | 3.x 或 >=3.0.0 <4.0.0 |
⚠️注意:在波形符范围内指定预发行版将仅匹配同一完整版本中的预发行版。例如,版本范围 ~3.1.4-beta.2 将与 3.1.4-beta.4 匹配,但不会与 3.1.5-beta.2 匹配,因为 major.minor.patch 版本不同。
插入符范围
允许进行不修改版本中第一个非零数字的修改。即3.1.4中的3或0.4.2中的4。
| 版本范围 | 扩展版本范围 |
|---|---|
^3.1.4 | >=3.1.4 <4.0.0 |
^0.4.2 | >=0.4.2 <0.5.0 |
^0.0.2 | >=0.0.2 <0.0.3 |
⚠️注意:默认情况下,当你运行 yarn add [package-name] 时,它将使用插入符号范围。
如果版本的一部分被遗漏,则缺失的部分将用零填充。但是,他们仍然允许更改该值。
| 版本范围 | 扩展版本范围 |
|---|---|
^0.0.x | >=0.0.0 <0.1.0 |
^0.0 | >=0.0.0 <0.1.0 |
^0.x | >=0.0.0 <1.0.0 |
^0 | >=0.0.0 <1.0.0 | |
知识扩展:选择性依赖解决方案
Yarn 支持选择性版本解析,它允许你通过 package.json 文件中的 resolutions 字段定义依赖内的自定义包版本或范围。通常,这需要在 yarn.lock 文件中进行手动编辑。
在package.json中加入resolutions配置图下
"resolutions": {
"commander": "^2.17.1"
}
最终commander安装的版本是2.20.3。