起因
最近看到一个不错的项目,想要学习一下,但是clone下来之后,竟然连npm包都无法安装!!
没错,又是万恶的node-gyp报错。不过作为一个地中海程序员,遇到bug必当消灭之!
发现问题思路
根据报错信息看起来node-gyp报错似乎是pyhton版本不匹配引起的,但问题是我其他项目都可以运行,为啥这个项目不行呢?而且我相信,作者上传的时候一定是可以在本地正常运行的。经过研究package.json这个文件,我发现这里的包版本都太老了,所以我断定可能是因为我本地的node版本比作者的版本高,所以导致才各个依赖无法正常安装。
解决问题思路
发现是node版本过高导致的包依赖异常。解决办法自然是安装与当前node版本匹配的包。因此我们需要:
- 先删除
package.json中dependencies和devDependencies - 重新用
node install -S xxx和node install -D xxx分别重装依赖包 - 安装过程中如果报错,常常是因为依赖包之间的依赖冲突导致的,因为有的包依赖高版本的
webpack,有的依赖低版本的webpack - 这时我们需要先把可以正常安装的包先安装好,有冲突的包单独安装,安装时注意安装顺序:
先安装依赖低版本
webpack的包,再安装依赖高版本webpack的包
- 当安装依赖高版本的包时,还会报错:因为
npm install命令默认安装最新版本的包,报错还是因为版本过高
- 所以这时我们需要指定版本安装,选择一个适合当前依赖的版本
- 我们需要一个命令查看包的版本历史:
npm view xxxx versions
- 选择大版本的最后一个版本安装,如果报错则继续降低大版本,直到安装成功
- 至此应该是可以正确安装所有依赖包了,这时候可以运行项目
yarn dev - 如果运行报ERROR: PostCSS received undefined instead of CSS string,可以运行
npm rebuild node-sass命令解决。
成功运行!!!
其他思路
既然是node版本过高引起的,那理论上也可以通过降低node版本来解决。所以可以通过nvm工具来管理低版本的node。
结尾
这套方法是我自己慢慢摸索处理的,虽然繁琐,但是应该是可以解决node包版本依赖的问题的.当然如果有小伙伴知道更好的解决方案,也可以留言分享出来,大家共同进步啊。