解决commander@12.1.0: The engine "node" is incompatible with this module问题

592 阅读3分钟

框架原型:github.com/PanJiaChen/…

执行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依赖版本为*

image.png

解决办法

在package.json文件中增加如下配置:

"resolutions": {
    "commander": "^2.17.1"
}

知识延伸:依赖的版本

yarn 语义版本控制

Yarn 中的包遵循语义版本控制,也称为"semver"。当你从注册表安装新软件包时,它将使用semver版本范围添加到你的package.json中。

这边版本分为major.minor.patch,看起来像以下之一:3.14.10.42.02.7.8。版本的每个部分都会在不同的时间递增:

  • 当你对包的API进行破坏性或不兼容的更改时,增加major
  • 添加新功能时增加minor,同时保持向后兼容。
  • 当你修复错误并保持向后兼容时增加patch

⚠️注意:有时,semver格式也有“labels”或“extensions”,用于标记预发布或测试版等内容(例如2.0.0-beta.3

当开发者谈论两个semver版本彼此为“compatible”时,他们指的是向后兼容的更改(minorpatch)。

版本范围

当你想要指定依赖时,你可以在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.13.1.x 或 >=3.1.0 <3.2.0
~33.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中的30.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

yarn安装对于同一个包的多个版本是如何提升和去重的?