node本地项目发生依赖包因更新而不兼容导致项目启动错误解决记录

问题描述
今日在打包原来的项目时发现打包时突然出现了错误。排查以后发现是因为相关依赖包更新导致的问题。
错误提示如下。

image.png

排查后发现具体原因为:ko-sleep的版本进行了更新并且将它的依赖ms模块版本设置为了*导致此次问题发生。
因为ko-sleep直接被模块mz-modules依赖,而mz-modules为egg启动模块egg-bin的依赖模块。相当于egg-bin间接依赖ko-sleep模块。所在团队所有基础框架均为egg,所以此错误如果不及时处理将影响所有相关业务的项目打包上线。

以下为解决问题流程

  • 使用cnpm命令本地安装项目所依赖所有模块,安装完成后运行npm list ko-sleep后展示消息如下
    image.png

    发现依赖ko-sleep的模块为mz-modules.此模块为egg框架中egg-bin模块所依赖的模块。当前项目中依赖的mz-modules的版本为2.1.0。此版本的package.json中对于 ko-sleep依赖的版本为1.0.3版本。
    通过命令npm info ms-modules查看信息如下
    image.png

    发现本地安装ko-sleep版本为1.1.4,与mz-modules包中配置的1.0.3版本相比进行了更新。语法由原来的js语法直接变为了ts语法。。。

  • 为排除因cnpm 导致的问题使用 npm install 重装一遍。

运行npm info mz-modules命令之后发现其版本也是2.1.0。

image.png

同样查看ko-sleep模块信息发现

image.png

ko-sleep模块版本为1.1.4与之前信息一致。

查看ko-sleep模块的依赖关

image.png

与cnpm略有不同,但版本仍为1.1.4.

通过以上安装信息发现导致ko-sleep 模块更新的原因可能有以下几点。

1.pageckage.json配置的版本没有固定导致此问题

2.Npm 和 cnpm 都没有进行版本锁定导致此问题、有版本锁定配置文件package-lock.json存在时依然会有次版本号更新问题。

针对以上几种种猜测进行问题复现与修复。

1. 修改package.json配置

通过观察发现,疑似egg-bin版本从4.14升级为4.16之后出现了这个问题,那么我们直接指定项目的egg-bin版本。为4.14.x重新设置package.json配置之后运行npm install安装所有模块。

安装完成之后npm list 所有依赖信息显示如下。

image.png

上图显示修改的egg-bin版本配置已经生效,此次安装的egg-bin版本为4.14.1版本。

之后查看依赖ko-sleep 的mz-modules版本信息。

image.png

mz-modules 的版本号仍为2.1.0.

查看ko-sleep信息

image.png

版本号仍为1.1.4无变化

所以修改package.json版本配置解决此问题的方式并没有生效。Package.json中的版本配置不是导致间接依赖升级的原因。

2. 进行版本锁定:

添加 package.lock.json 或者yarn.lock 发现 锁定文件中的依赖信息为

ko-sleep@^1.0.3:

  version "1.1.4"

  resolved "http://npm.light.fang.com/ko-sleep/-/ko-sleep-1.1.4.tgz#56462fba835e07bb8c26cfa083f9893a3fde5469"

  integrity sha1-VkYvuoNeB7uMJs+gg/mJOj/eVGk=

  dependencies:

    ms "*"

ko-sleep 依赖配置信息如下依然显示为1.1.4版本

多次安装不会进行升级(不排除官方ko-sleep版本没有升级的影响)

版本锁定在新项目之初是非常有用的,对于已经因为版本更新出问题的项目意义不是很大。重新生成的package-lock.json之后的依赖也为最新版本。

解决方法:因为是ko-sleep版本更新问题,要保证次版本不再因升级导致问题,则直接指定次包版本即可。

看与项目之前一直兼容的ko-sleep包的版本,确定为1.0.3.直接安装1.0.3版本

npm install ko-sleep@1.0.3 --save

之后在package.json中修改ko-sleep版本号。

image.png

将允许修改次版本号改为只允许bug。
~1.0.3
之后运行npm install

安装完成后运行npm list查看ko-sleep版本与依赖关系。

image.png

发现ko-sleep版本为1.0.3版本,问题解决。

问题分析总结,通过查看npm 开发文档发现,平时项目使用和配置并无任何问题,问题出在ko-sleep开发者。此开发者未遵守主版本号,次版本号能更改内容的定义。只有更新主版本号时才可使用不兼容上一版本的语法以及结构。从1.1.0开始作者直接使用ts重写了整个包,并且未使用主版本号发布为2.0.x.而是直接使用次版本号发布为1.1.x。导致此错误。
另外做项目时要及时生成文件锁定配置。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容