如何强行排除NPM的嵌套依赖关系?

pul*_*hal 7 node.js npm

我正在使用node 0.10.xnpm 2.15.0,我想强行排除最终被安装的嵌套依赖项。

到目前为止,我已经尝试创建npm-shrinkwrap.json并手动编辑它来删除嵌套的依赖关系,但是在运行之后rm -rf node_modules && npm install...我仍然可以看到为以下内容构建的嵌套依赖关系:

kerberos@0.0.19 install /.../node_modules/loopback-connector-mongodb/node_modules/mongodb/node_modules/kerberos
(node-gyp rebuild) || (exit 0)
CXX(target) Release/obj.target/kerberos/lib/kerberos.o
CXX(target) Release/obj.target/kerberos/lib/worker.o
CC(target) Release/obj.target/kerberos/lib/kerberosgss.o
CC(target) Release/obj.target/kerberos/lib/base64.o
CXX(target) Release/obj.target/kerberos/lib/kerberos_context.o
SOLINK_MODULE(target) Release/kerberos.node
Run Code Online (Sandbox Code Playgroud)

GOT*_*O 0 14

npm >= 8.3.0

使用新版本 npm 的覆盖功能,现在可以通过将其替换为本地文件系统的链接来防止安装依赖项的依赖项。这有点像 hack,但它可以在 Unix 和 Windows 上运行。

首先,确保您使用的是 npm 8.3.0 或更高版本。在命令行中输入:

npm -v
Run Code Online (Sandbox Code Playgroud)

查看安装的 npm 版本。

现在,看看问题中的示例,假设您的某个依赖项已安装旧版本,而该旧版本mongodb又安装kerberos在您的 node_modules 文件夹中。

您无论如何都不使用它kerberos,并且不希望它被安装npm install,因此请"overrides"像这样编辑 package.json 文件的部分:

包.json

{
  ...
  "overrides": {
    "kerberos": "../_EXCLUDED_"
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)

请务必npm install在更改后再次运行。这将创建一个符号链接 (Unix) 或一个连接 (Windows):

node_modules/mongodb/node_modules/kerberos-> node_modules/mongodb/node_modules/_EXCLUDED_

符号链接的目标不存在:这样,每次尝试使用kerberosrequire加载import都会导致一个容易检测到的错误:

错误:找不到模块“kerberos”

这应该可以使您免于因排除所需的依赖项而导致的调试错误的痛苦。


小智 5

面临同样的问题,并创建了一个虚拟包dry-uninstall来覆盖未使用的依赖项。在package.lock"overrides"部分使用它:

{
  "overrides": {
    "kerberos": "npm:dry-uninstall"
  }
}
Run Code Online (Sandbox Code Playgroud)

这与GOTO 0答案中的黑客相同,但包有空index.js,因此代码不会在require('kerberos')或 上失败import


suo*_*suo -2

NPM 团队提供了一些建议,可能对此类情况也有帮助。请参阅: https://blog.npmjs.org/post/145724408060/dealing-with-problematic-dependency-in-a

他们的建议本质上是分支或分叉拉入您不想要的依赖项的依赖项。从您的代码片段中,我认为您想要分叉 mongodb 模块并删除对 kerberos 的依赖关系并更新 Loopback-connector-mongodb 以使用您的 mongodb 分叉。

在分叉依赖项时,对类似问题的回答可能会有所帮助: /sf/answers/2474449911/

也可以用虚拟包替换您要删除的包。为此,请创建一个新包(例如npm init kerberos)并更新 package-lock.json (或 npm-shrinkwrap.json,如果您愿意)以将其替换为真正的 kerberos 包。