什么是EINTEGRITY
- Integrity是一个校验码,该校验码根据包的来源不同,来源多种多样,在首次安装一个依赖时,会将该校验码存入package-lock中。重建依赖时,则会将新获取到的校验码与lock中的比较进行校验,确保下到的是同一个包。EINTEGRITY即校验失败时抛出的错误码。
- 需要注意的是,上面提到的下载包也包含来自本地全局缓存的包,如果你需要的一个包已经在本次缓存有了,是不会去仓库中下载的,如果本地缓存的包不能通过校验,也会产生该错误码
EINTEGRITY的错误信息
该错误的常见格式如下,我这边为了方便查看按内容断行
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)
其中第三行和第五行是始终一样的,我们直接关注第五行和第七八行即可
第五行wanted代表package-lock中存储的校验值,是期望下到的包校验值是这个
第七八行but got代表实际下到的包所计算出的校验值,如果七八行中的计算结果不能包含第五行的校验值,就会报错
请注意,不同的错误原因产生的错误信息也会不同,但是句式是一样的,不同的错误信息将对应不同的解决方案
解决方案
1.npm5早期版本的错误
在查阅相关资料时,有人提到npm5将哈希算法从SHA-1换成了SHA-512,导致原先npm4创建的全局缓存中的包全部无法校验通过,这种条件情境下,错误信息是
wanted sha1- but got sha512-
注意got后面没有sha-1的版本。这个问题在更新的npm上不存在,因为更新的npm会同时产生两种算法的校验值供校验,提供向下兼容
解决方法也比较简单,尝试执行下列指令,如果第一个修复缓存不行,就执行第二个清空缓存,重新创建即可
npm cache verify
npm cache clean -force
2.同一台电脑切换仓库/多台电脑仓库不同导致的问题
同一个包在不同仓库中有不同的内容,这在使用私有仓库时会比较常见,很多公司会选则在私有仓库上传带源码的版本,公共仓库上传编译好的版本。这里我们假设同一个包在淘宝镜像和私有仓库中有不同版本,校验码也不同,则在以下场景下会产生错误:
- 同一台电脑之前用淘宝镜像,下载了一个包,lock中存下了来自淘宝镜像的校验码,然后切换成另一个镜像。此时删除node_modules重新npm install也不会有问题,因为此时你下到的包来自本地缓存,即还是原来淘宝镜像的包。但如果强制清空缓存,再install,就会报错,因为此时你是从私有仓库上下载包了,而且这个包的校验码和lock不同,产生错误。
- 两台电脑,一台电脑上用淘宝镜像,并在lock中写入了淘宝镜像的校验码,另一台电脑上用了私有仓库,此时在另一台电脑上install就是会报错的,这种情景常见于多人协作时
这种情况的典型现象是,错误信息中,校验算法能够重合,但是校验结果不同,你可以拿着wanted后面的校验值去lock文件中搜索,从而确定是哪个包出了问题,然后比对不同仓库中该包的内容是否不同,如果不同,就可以确认是仓库不同导致的问题。
修复的方法也比较简单,如果是同一台电脑切换仓库导致的问题,你可以选择切回原来的仓库,或删除lock文件用新仓库的数据重建lock。如果是多台电脑仓库不同的问题,则需要统一使用的仓库,并将换过仓库的电脑上的全局缓存清除,用新仓库重建缓存
3.本地缓存/lock文件真的出问题了
你最近没有干奇怪的事情,没有切换仓库,lock也没人动过,但是用install重建依赖时就是不行,则有可能缓存和lock文件中至少有一个抽风了,最彻底的解决办法即按第一种中的方法修复或清空缓存,如果还不行,就只能删除lock,用install直接重建了,但删除lock会导致依赖版本改变,需谨慎操作
网友评论