什么是EINTEGRITY
- Integrity是一個校驗碼,該校驗碼根據(jù)包的來源不同,來源多種多樣,在首次安裝一個依賴時,會將該校驗碼存入package-lock中。重建依賴時,則會將新獲取到的校驗碼與lock中的比較進行校驗,確保下到的是同一個包。EINTEGRITY即校驗失敗時拋出的錯誤碼。
- 需要注意的是,上面提到的下載包也包含來自本地全局緩存的包,如果你需要的一個包已經(jīng)在本次緩存有了,是不會去倉庫中下載的,如果本地緩存的包不能通過校驗,也會產(chǎn)生該錯誤碼
EINTEGRITY的錯誤信息
該錯誤的常見格式如下,我這邊為了方便查看按內(nèi)容斷行
npm ERR! code EINTEGRITY
npm ERR!
sha1-3oCfpg5otvf1xbsipSP12QjYTT0=
integrity checksum failed when using sha1:
wanted sha1-3oCfpg5otvf1xbsipSP12QjYTT0=
but got
sha512-3HMvsKqXsMwlY5JNROGLk1HPqwaAQuLYFjTTauGQjTsP0mCRqUUkgaRoiwo71IXXqxiEQ+VyIUE+sSTK/2fUZA==
sha1-2C3OGQU/AAws1lPFqLi0ayQlGQc=
.(1781 bytes)
其中第三行和第五行是始終一樣的,我們直接關(guān)注第五行和第七八行即可
第五行wanted代表package-lock中存儲的校驗值,是期望下到的包校驗值是這個
第七八行but got代表實際下到的包所計算出的校驗值,如果七八行中的計算結(jié)果不能包含第五行的校驗值,就會報錯
請注意,不同的錯誤原因產(chǎn)生的錯誤信息也會不同,但是句式是一樣的,不同的錯誤信息將對應(yīng)不同的解決方案
解決方案
1.npm5早期版本的錯誤
在查閱相關(guān)資料時,有人提到npm5將哈希算法從SHA-1換成了SHA-512,導(dǎo)致原先npm4創(chuàng)建的全局緩存中的包全部無法校驗通過,這種條件情境下,錯誤信息是
wanted sha1- but got sha512-
注意got后面沒有sha-1的版本。這個問題在更新的npm上不存在,因為更新的npm會同時產(chǎn)生兩種算法的校驗值供校驗,提供向下兼容
解決方法也比較簡單,嘗試執(zhí)行下列指令,如果第一個修復(fù)緩存不行,就執(zhí)行第二個清空緩存,重新創(chuàng)建即可
npm cache verify
npm cache clean -force
2.同一臺電腦切換倉庫/多臺電腦倉庫不同導(dǎo)致的問題
同一個包在不同倉庫中有不同的內(nèi)容,這在使用私有倉庫時會比較常見,很多公司會選則在私有倉庫上傳帶源碼的版本,公共倉庫上傳編譯好的版本。這里我們假設(shè)同一個包在淘寶鏡像和私有倉庫中有不同版本,校驗碼也不同,則在以下場景下會產(chǎn)生錯誤:
- 同一臺電腦之前用淘寶鏡像,下載了一個包,lock中存下了來自淘寶鏡像的校驗碼,然后切換成另一個鏡像。此時刪除node_modules重新npm install也不會有問題,因為此時你下到的包來自本地緩存,即還是原來淘寶鏡像的包。但如果強制清空緩存,再install,就會報錯,因為此時你是從私有倉庫上下載包了,而且這個包的校驗碼和lock不同,產(chǎn)生錯誤。
- 兩臺電腦,一臺電腦上用淘寶鏡像,并在lock中寫入了淘寶鏡像的校驗碼,另一臺電腦上用了私有倉庫,此時在另一臺電腦上install就是會報錯的,這種情景常見于多人協(xié)作時
這種情況的典型現(xiàn)象是,錯誤信息中,校驗算法能夠重合,但是校驗結(jié)果不同,你可以拿著wanted后面的校驗值去lock文件中搜索,從而確定是哪個包出了問題,然后比對不同倉庫中該包的內(nèi)容是否不同,如果不同,就可以確認(rèn)是倉庫不同導(dǎo)致的問題。
修復(fù)的方法也比較簡單,如果是同一臺電腦切換倉庫導(dǎo)致的問題,你可以選擇切回原來的倉庫,或刪除lock文件用新倉庫的數(shù)據(jù)重建lock。如果是多臺電腦倉庫不同的問題,則需要統(tǒng)一使用的倉庫,并將換過倉庫的電腦上的全局緩存清除,用新倉庫重建緩存
3.本地緩存/lock文件真的出問題了
你最近沒有干奇怪的事情,沒有切換倉庫,lock也沒人動過,但是用install重建依賴時就是不行,則有可能緩存和lock文件中至少有一個抽風(fēng)了,最徹底的解決辦法即按第一種中的方法修復(fù)或清空緩存,如果還不行,就只能刪除lock,用install直接重建了,但刪除lock會導(dǎo)致依賴版本改變,需謹(jǐn)慎操作