如何强制排除NPM的嵌套依赖?

mwg9r5ms  于 2023-10-19  发布在  其他
关注(0)|答案(3)|浏览(270)

我正在使用node 0.10.xnpm 2.15.0,我想强制排除最终安装的嵌套依赖项。
到目前为止,我已经尝试创建npm-shrinkwrap.json并手动编辑它以删除嵌套的依赖项,但在运行rm -rf node_modules && npm install后...我仍然可以看到正在构建的嵌套依赖项:

[email protected] 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
xtfmy6hx

xtfmy6hx1#

npm >= 8.3.0

使用新版本npm的overrides功能,现在可以通过将依赖项替换为本地文件系统的链接来防止依赖项的安装。这是一个有点黑客,但它在Unix和Windows上都工作。
首先,确保您使用的是npm 8.3.0或更高版本。在命令行中输入:

npm -v

查看安装的npm版本。
现在,看看问题中的示例,假设您的一个依赖项安装了旧版本的mongodb,而该依赖项又在您的node_modules文件夹中安装了kerberos
您不会使用kerberos,也不希望它由npm install安装,因此像这样编辑package.json文件的"overrides"部分:

package.json

{
  ...
  "overrides": {
    "kerberos": "../_EXCLUDED_"
  },
  ...
}

请确保在此更改后再次运行npm install。这将创建一个符号链接(Unix)或连接(Windows):
node_modules/mongodb/node_modules/kerberos -> node_modules/mongodb/node_modules/_EXCLUDED_
这意味着符号链接的目标不存在:这样,每次尝试使用requireimport加载kerberos都会导致一个容易检测到的错误:
错误:无法找到模块“Cannot find”
这应该保存您从痛苦的调试错误所造成的排除依赖是必需的。

pkln4tw6

pkln4tw62#

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

{
  "overrides": {
    "kerberos": "npm:dry-uninstall"
  }
}

这与 * 后藤0* answer中的hack相同,但包中有空的index.js,因此代码不会在require('kerberos')import上失败。

50pmv0ei

50pmv0ei3#

NPM团队提供了一些建议,可能也有助于这种情况。参见:https://blog.npmjs.org/post/145724408060/dealing-with-problematic-dependencies-in-a
他们的建议本质上是,对正在拉入您不想要的依赖项的依赖项进行分支或分叉。从你的代码片段中,我认为你想fork mongodb模块,并删除对kernodb的依赖,并更新loopback-connector-mongodb以使用你的mongodb fork。
这个类似问题的答案在分叉依赖项时可能会有所帮助:https://stackoverflow.com/a/35349284/1524989
也可以用一个虚拟包来替换您想要删除的包。为此,创建一个新的包(例如,npm init kerberos)并更新package-lock.json(或者npm-shrinkwrap.json,如果您愿意的话),以将其替换为真实的keratom包。

相关问题