React Native项目中npm安装包时自动移除其他包的解决办法
这种情况我之前也碰到过,大多是因为依赖版本冲突搞的鬼——你要安装的新包和已有的某个包,对第三方依赖的版本要求互相矛盾,npm为了保证整个依赖树能正常工作,就会自动移除冲突的包来解决这个矛盾。
给你几个实用的解决办法:
锁定依赖版本:打开你的
package.json,把那些容易出问题的包的版本号从带^或~的模糊版本(比如^1.0.0)改成固定的精确版本(比如1.2.3)。改完后重新运行npm install,这样npm就不会随便更新或替换这些包了。使用特定参数安装:如果只是临时装个包测试,用
npm install 你的包名 --no-save,这样不会改动package.json和package-lock.json,自然也不会影响已有的包。要是打算永久安装且固定版本,就用npm install 你的包名 --save-exact,它会把精确版本直接写入package.json。手动排查并调整依赖:先搞清楚到底是哪个包在搞事情,运行
npm ls 被移除的包名,就能看到是哪个依赖导致的版本冲突。然后你可以尝试升级或者降级冲突的其中一个包,让它们的依赖要求能兼容。比如包A要求依赖X@2.0,包B要求X@1.0,那要么把包A降到支持X@1.0的版本,要么把包B升到支持X@2.0的版本。强制指定依赖版本:用
npm-force-resolutions工具来强制解决冲突。在package.json里添加一个resolutions字段:"resolutions": { "冲突的依赖包名": "你要指定的版本号" }然后在
scripts里加一条预安装命令:"scripts": { "preinstall": "npx npm-force-resolutions" }之后再运行
npm install,它就会强制用你指定的版本,不会再乱删包了。保留package-lock.json文件:这个文件是用来锁定依赖版本的,只要它存在,npm就会按照里面的版本来安装,尽量别删除它,不然重新生成的依赖树可能又会出现版本冲突的问题。
内容的提问来源于stack exchange,提问作者Adam Lagevik

