项目场景:
npm7 install package 依赖包与宿主环境冲突,无法can't relosve dependency,npm7会报错,并提供解决方法,但是该解决方法并不能保证正确的依赖关系。问题描述:
使用版本7的npm下载一个packageA,发现packageA依赖的某个包和宿主环境的包版本有冲突,此时控制终端输入如下提示:
官方提醒我们使用 --force 进行强制下载, --legacy-peer-deps 来忽略下载。如此,npm install 至少保证能下载成功,只是依赖指向是错的。如下图:
上图deduped表示,该依赖版本与宿主环境相同,移除并指向宿主环境。但是这不符合packageA的package.json的要求啊!
原因分析:
这种情况其实经常会出现。
使用最新的脚手架,导致其他UI组件和npm软件跟不上最新的版本,总有旧的版本产生冲突;
反之亦然
原因很简单,就是依赖包和宿主环境冲突了(好废话。。)。
那解决问题的思路就是单独安装单个包的依赖。
解决方案:
如果宿主环境的和其他软件依赖包不同,那就单独下载到自己的包下面呗。反正在当前目录下载时,遵循当前目录的package.json的使用。
我猜测因为没有更高层级的tree存在,因此该方法才能通过。
1、先执行 **npm install packageA --legacy-peer-deps**,忽略有冲突的依赖包的下载,保证packageA被正常下载 2、然后 cd node_modules/packageA/, 来到packageA的安装目录,执行npm install,该操作会按照当前package.json的配置来,没有宿主环境的干扰
再次查看依赖关系,显示正常。
要查找当前包依赖的其他包的位置,使用:
npm explore packageB(依赖的包名)
会自动进入该位置目录,输入exit 回车可退出。
更新:
如果上述方法还没有解决你的依赖问题,或者你再运行npm start的时候报错了,请往下看。
npm install packageA 结束后,是否提醒你 添加了 几个包,删除了几个包?(对的,它可能删除了其他的依赖包(peerDependency)!会导致别的包无法使用,影响你程序的继续运行)
下面是我的记录,ng2-smart-table删除了看似跟他不相关的别的包的依赖包。
这导致它自己看起来正常了,但是别的包在npm start的时候引用不停地报错了。
然后我将depth打到最深,npm ls --all 列出了所有的依赖包,还是没看懂他的remove逻辑在哪儿(他删除了不属于自己任何dependency的包)。
最后我将无故被自动删除的这些包,放到了root package.json下面,这样下载的时候会自动下载到最顶层,
至少我觉得npm install,不会导致顶层包被删除,却可以删除peerDependency的包。因为允许–legacy-peer-deps选项,这意味着你可以不严格按照peerDenpency的要求,npm允许你这样下载,即允许你这样做。
同时将packageA也添加到root package.json。最终下载成功。
更新部分是实践的结果,因为尚未找到npm install时引起一些表现的原因,所以之后这个会持续更新,直到找到root casue。
希望能帮到有用的人吧。