問題描述
今日在打包原來的項(xiàng)目時發(fā)現(xiàn)打包時突然出現(xiàn)了錯誤。排查以后發(fā)現(xiàn)是因?yàn)橄嚓P(guān)依賴包更新導(dǎo)致的問題。
錯誤提示如下。

排查后發(fā)現(xiàn)具體原因?yàn)椋簁o-sleep的版本進(jìn)行了更新并且將它的依賴ms模塊版本設(shè)置為了*導(dǎo)致此次問題發(fā)生。
因?yàn)閗o-sleep直接被模塊mz-modules依賴,而mz-modules為egg啟動模塊egg-bin的依賴模塊。相當(dāng)于egg-bin間接依賴ko-sleep模塊。所在團(tuán)隊(duì)所有基礎(chǔ)框架均為egg,所以此錯誤如果不及時處理將影響所有相關(guān)業(yè)務(wù)的項(xiàng)目打包上線。
以下為解決問題流程
- 使用cnpm命令本地安裝項(xiàng)目所依賴所有模塊,安裝完成后運(yùn)行
npm list ko-sleep后展示消息如下
image.png
發(fā)現(xiàn)依賴ko-sleep的模塊為mz-modules.此模塊為egg框架中egg-bin模塊所依賴的模塊。當(dāng)前項(xiàng)目中依賴的mz-modules的版本為2.1.0。此版本的package.json中對于 ko-sleep依賴的版本為1.0.3版本。
通過命令npm info ms-modules查看信息如下
image.png
發(fā)現(xiàn)本地安裝ko-sleep版本為1.1.4,與mz-modules包中配置的1.0.3版本相比進(jìn)行了更新。語法由原來的js語法直接變?yōu)榱藅s語法。。。
-
為排除因cnpm 導(dǎo)致的問題使用 npm install 重裝一遍。
運(yùn)行npm info mz-modules命令之后發(fā)現(xiàn)其版本也是2.1.0。

同樣查看ko-sleep模塊信息發(fā)現(xiàn)

ko-sleep模塊版本為1.1.4與之前信息一致。
查看ko-sleep模塊的依賴關(guān)

與cnpm略有不同,但版本仍為1.1.4.
通過以上安裝信息發(fā)現(xiàn)導(dǎo)致ko-sleep 模塊更新的原因可能有以下幾點(diǎn)。
1.pageckage.json配置的版本沒有固定導(dǎo)致此問題
2.Npm 和 cnpm 都沒有進(jìn)行版本鎖定導(dǎo)致此問題、有版本鎖定配置文件package-lock.json存在時依然會有次版本號更新問題。
針對以上幾種種猜測進(jìn)行問題復(fù)現(xiàn)與修復(fù)。
1. 修改package.json配置
通過觀察發(fā)現(xiàn),疑似egg-bin版本從4.14升級為4.16之后出現(xiàn)了這個問題,那么我們直接指定項(xiàng)目的egg-bin版本。為4.14.x重新設(shè)置package.json配置之后運(yùn)行npm install安裝所有模塊。
安裝完成之后npm list 所有依賴信息顯示如下。

上圖顯示修改的egg-bin版本配置已經(jīng)生效,此次安裝的egg-bin版本為4.14.1版本。
之后查看依賴ko-sleep 的mz-modules版本信息。

mz-modules 的版本號仍為2.1.0.
查看ko-sleep信息

版本號仍為1.1.4無變化
所以修改package.json版本配置解決此問題的方式并沒有生效。Package.json中的版本配置不是導(dǎo)致間接依賴升級的原因。
2. 進(jìn)行版本鎖定:
添加 package.lock.json 或者yarn.lock 發(fā)現(xiàn) 鎖定文件中的依賴信息為
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版本
多次安裝不會進(jìn)行升級(不排除官方ko-sleep版本沒有升級的影響)
版本鎖定在新項(xiàng)目之初是非常有用的,對于已經(jīng)因?yàn)榘姹靖鲁鰡栴}的項(xiàng)目意義不是很大。重新生成的package-lock.json之后的依賴也為最新版本。
解決方法:因?yàn)槭莐o-sleep版本更新問題,要保證次版本不再因升級導(dǎo)致問題,則直接指定次包版本即可。
看與項(xiàng)目之前一直兼容的ko-sleep包的版本,確定為1.0.3.直接安裝1.0.3版本
npm install ko-sleep@1.0.3 --save
之后在package.json中修改ko-sleep版本號。

將允許修改次版本號改為只允許bug。
~1.0.3
之后運(yùn)行npm install
安裝完成后運(yùn)行npm list查看ko-sleep版本與依賴關(guān)系。

發(fā)現(xiàn)ko-sleep版本為1.0.3版本,問題解決。
問題分析總結(jié),通過查看npm 開發(fā)文檔發(fā)現(xiàn),平時項(xiàng)目使用和配置并無任何問題,問題出在ko-sleep開發(fā)者。此開發(fā)者未遵守主版本號,次版本號能更改內(nèi)容的定義。只有更新主版本號時才可使用不兼容上一版本的語法以及結(jié)構(gòu)。從1.1.0開始作者直接使用ts重寫了整個包,并且未使用主版本號發(fā)布為2.0.x.而是直接使用次版本號發(fā)布為1.1.x。導(dǎo)致此錯誤。
另外做項(xiàng)目時要及時生成文件鎖定配置。

