首页 > 解决方案 > 当我使用插入符号时,npm 安装了具有不同补丁版本的模块的两个版本

问题描述

我的项目 package.json

dependencies: {
    A: "^0.0.2",
    B: "^0.0.1"
}

模块 B package.json

dependencies: {
    A: "^0.0.1",
}

当我nmp install为我的项目运行时,它会安装模块 A 两次。一次在顶层(版本 0.0.2)和一次嵌套在模块 B(版本 0.0.1)中:

project/node_modules/A                   <--0.0.2
project/node_modules/B/node_modules/A    <--0.0.1

但我在两个 package.json 文件中都使用了^ 。那么,为什么即使我重新安装模块 B,它也不使用模块 A 的顶级安装,而不是获取模块 A 的嵌套版本?

毕竟,A@^0.0.1应该匹配A@0.0.2吧?

标签: npmmoduleversion

解决方案


这是按照设计。看到这个答案

npm install 使用 ^ 依赖而不是完全匹配

这是因为 ^0.0.1 被认为等同于 0.0.1。

当一个包的版本以 0 开头时,它被认为是在开发中,并且语义版本控制规则是不同的。当版本为 0.0.X 时,可以预期任何一个数字的增加都会产生重大变化。你可以在这里看到规则。

插入符号范围 ^1.2.3 ^0.2.5 ^0.0.4

允许不修改 [major, minor, patch] 元组中最左边的非零数字的更改。换言之,这允许对 1.0.0 及更高版本进行补丁和次要更新,对 0.X >=0.1.0 版本进行补丁更新,对 0.0.X 版本不进行更新。

当您增加次要版本时,您可能会看到插入符号,但它也会有上面提到的特殊规则。当您增加主要版本时,“正常”规则开始应用。

您还可以查看以下页面以获取更多详细信息

https://docs.npmjs.com/misc/semver#caret-ranges-123-025-004

它清楚地显示^0.0.3 := >=0.0.3 <0.0.4,这意味着^0.0.X0.0.X


推荐阅读