我正在使用node 0.10.x
和npm 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
3条答案
按热度按时间xtfmy6hx1#
npm >= 8.3.0
使用新版本npm的overrides功能,现在可以通过将依赖项替换为本地文件系统的链接来防止依赖项的安装。这是一个有点黑客,但它在Unix和Windows上都工作。
首先,确保您使用的是npm 8.3.0或更高版本。在命令行中输入:
查看安装的npm版本。
现在,看看问题中的示例,假设您的一个依赖项安装了旧版本的
mongodb
,而该依赖项又在您的node_modules文件夹中安装了kerberos
。您不会使用
kerberos
,也不希望它由npm install
安装,因此像这样编辑package.json文件的"overrides"
部分:package.json
请确保在此更改后再次运行
npm install
。这将创建一个符号链接(Unix)或连接(Windows):node_modules/mongodb/node_modules/kerberos
->node_modules/mongodb/node_modules/_EXCLUDED_
这意味着符号链接的目标不存在:这样,每次尝试使用
require
或import
加载kerberos
都会导致一个容易检测到的错误:错误:无法找到模块“Cannot find”
这应该保存您从痛苦的调试错误所造成的排除依赖是必需的。
pkln4tw62#
面对同样的问题,并创建了一个虚拟包dry-uninstall来覆盖未使用的依赖项。在package.lock的
"overrides"
部分使用:这与 * 后藤0* answer中的hack相同,但包中有空的
index.js
,因此代码不会在require('kerberos')
或import
上失败。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包。