关于依赖间接升级与nodejs版本兼容

今天在折腾运维的app版本管理系统fabu.love的时候,发现项目在Windows下无法启动,也无法安装完成依赖,根本无法快乐地撸代码。因为之前在虚拟机的linux上面改的,一直没有好好找这个原因,所以今天就花时间去弄了一下。

安装报错

一般来说,我们拿到前端项目后,先是快乐地npm install,然后就npm start跑起来。fabu.love这个项目也是一样,从github上拉下来了,直接安装,但是,报错了!

node-pre-gyp ERR!

然后细看了一下,这个depencies的depencies里,有一个加密用的包:bcrypt,这个包要每个安装后编译,所以在安装这个包时出错了。搜索了一下,以下方案给解决了:

  1. 安装python2.7 npm install --global --production windows-build-tools
  2. 设置默认npm config set python python2.7
  3. 再重新执行npm install

这次终于顺利安装完成!开熏!

运行报错

安装完成后,开心地执行npm start...
terminal报错:
primordials is not defined

WTH...

这个是什么鬼?

再细看,原来是有一个包natives里出错了,这个natives的包,开发者声明废弃了,因为会导致内存泄漏等问题,最主要的是,它不与新版本的node兼容!

跟着报错链找上去,引用这个包的,是一个graceful-fs的包,而引用graceful-fs包的,是decompress-zip包,而我们项目里直接安装的,是引用了decompress-zip包的ipa-metadata2.

好深的套娃呀!

在终端里运行命令npm ls natives查看包的引用

`-- [email protected]
  `-- [email protected]
    `-- [email protected]
      `-- [email protected] 

但我们的包ipa-metadata2已经是最新的了,无法再升级,我也不能一个个开发者联系他们让他们升级这个包吧?那怎么处理呢?

解决办法

因为这是版本兼容的问题,所以处理的办法有两个:

  1. 降级nodejs
  2. 升级包

降级自然不太合理,因为我除了这个项目,还有别的项目需要新版本的nodejs,只能是第二个办法了:升级包。

由于ipa-metadata2包已经是最新的了,那只能是间接升级依赖包了。既然npm update没办法了,那我们能不能直接安装这个模块呢?先试试:

npm install [email protected]

安装完之后在package.json中将直接依赖natives删除。然后再次查看依赖:

`-- [email protected]
  `-- [email protected]
    `-- [email protected]
      `-- [email protected] 

这样就对了!

但是,这个安装是在本地操作的,如果我们把项目推上远程仓库,其他人拉下来,是不是又要重新操作一次呢?

这个时候,我们看一下package-lock.json这个文件,发现被锁定的版本也发现了改变:

"natives": {
    "version": "1.1.6",
    "resolved": "http://registry.npm.oa.com/natives/download/natives-1.1.6.tgz",
    "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA=="
    }

这样,我们只要把这个lock文件也推上去,别人安装时也就会安装这个版本的了。

关于lock文件

如果已经锁定了版本的情况下,需要更新直接依赖,则直接安装指定版本,package.json和package-lock.json都会同步更新。如果需要更新间接依赖的话,则需要像本文这样,手工安装一下,保证package-lock.json被更新到。或者如果其它模块的锁定并不是那么重要时,也可以直接删除package-lock.json,然后重新安装一遍,相当于把所有(直接依赖+间接依赖)模块全部更新一遍。

你可能感兴趣的:(关于依赖间接升级与nodejs版本兼容)