问题描述
今日在打包原来的项目时发现打包时突然出现了错误。排查以后发现是因为相关依赖包更新导致的问题。
错误提示如下。
排查后发现具体原因为:ko-sleep的版本进行了更新并且将它的依赖ms模块版本设置为了*导致此次问题发生。
因为ko-sleep直接被模块mz-modules依赖,而mz-modules为egg启动模块egg-bin的依赖模块。相当于egg-bin间接依赖ko-sleep模块。所在团队所有基础框架均为egg,所以此错误如果不及时处理将影响所有相关业务的项目打包上线。
以下为解决问题流程
- 使用cnpm命令本地安装项目所依赖所有模块,安装完成后运行
npm list ko-sleep
后展示消息如下
发现依赖ko-sleep的模块为mz-modules.此模块为egg框架中egg-bin模块所依赖的模块。当前项目中依赖的mz-modules的版本为2.1.0。此版本的package.json中对于 ko-sleep依赖的版本为1.0.3版本。
通过命令npm info ms-modules
查看信息如下
发现本地安装ko-sleep版本为1.1.4,与mz-modules包中配置的1.0.3版本相比进行了更新。语法由原来的js语法直接变为了ts语法。。。
-
为排除因cnpm 导致的问题使用 npm install 重装一遍。
运行npm info mz-modules
命令之后发现其版本也是2.1.0。
同样查看ko-sleep模块信息发现
ko-sleep模块版本为1.1.4与之前信息一致。
查看ko-sleep模块的依赖关
与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 所有依赖信息显示如下。
上图显示修改的egg-bin版本配置已经生效,此次安装的egg-bin版本为4.14.1版本。
之后查看依赖ko-sleep 的mz-modules版本信息。
mz-modules 的版本号仍为2.1.0.
查看ko-sleep信息
版本号仍为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版本号。
将允许修改次版本号改为只允许bug。
~1.0.3
之后运行npm install
安装完成后运行npm list查看ko-sleep版本与依赖关系。
发现ko-sleep版本为1.0.3版本,问题解决。
问题分析总结,通过查看npm 开发文档发现,平时项目使用和配置并无任何问题,问题出在ko-sleep开发者。此开发者未遵守主版本号,次版本号能更改内容的定义。只有更新主版本号时才可使用不兼容上一版本的语法以及结构。从1.1.0开始作者直接使用ts重写了整个包,并且未使用主版本号发布为2.0.x.而是直接使用次版本号发布为1.1.x。导致此错误。
另外做项目时要及时生成文件锁定配置。