场景
CICD编译时抛出npm error code EINTEGRITY的错误
npm error code EINTEGRITY
npm error sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== integrity checksum failed when using sha512: wanted sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== but got sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==. (318961 bytes)
npm error A complete log of this run can be found in: /root/.npm/_logs/2025-05-21T01_30_13_824Z-debug-0.log
解决
# 删除 node_modules and package-lock.json
rm -rf node_modules package-lock.json
# 清理和验证 npm cache
npm cache clean --force
npm cache verify
# 重新安装
npm install
分析
在运行到npm install
命令时,会看到进程失败并显示EINTEGRITY
错误代码。
错误示例输出如下:
npm ERR! code EINTEGRITY
npm ERR! sha512-vjA...Azq==
integrity checksum failed when using sha512:
wanted sha512-vjA...Azq==
but got sha512-MjAA...LNsqvg==. (161379 bytes)
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/nsebhastian/.npm/_logs/2022-06-16T10_04_42_791Z-debug.log
这是因为运行npm install
命令时,npm
将查找package.json
文件中列为依赖项的包,进行下载和安装。
当package-lock.json
当目录中有文件时,npm
会将下载的tarball.tgz
文件的校验和与在package-lock.json
文件中找到的校验和进行对比。
当文件和package-lock.json
文件EINTEGRITY
之间的校验和值不匹配时,就会发生如上所示的错误。
这段错误消息大概意思是:npm
说想要sha512……
但得到的是sha512……
。
wanted...
中的值是在package-lock.json
文件中找到的值。
got...
是npm
从tarball
文件生成校验和时得到的值。
两种方法可以解决此错误
1. 删除package-lock.json
文件,并在安装完成后让npm
生成一个新文件。
2. 更新package-lock.jso
文件中列出的完整性值。搜索并替换文件中错误消息中的值,将想要的值sha512-vjA...
替换为sha512-MjAA...(最终选取该方法)
当然,如果文件中有很多EINTEGRITY
错误时,这会很烦人。这种情况下直接删除package-lock.json
文件会更容易,因为npm
无论如何都会生成一个新文件。
如果上述方法不起作用,可按照以下步骤清除节点模块和npm
缓存文件夹:
# remove node_modules and package-lock.json
rm -rf node_modules package-lock.json
# Clear and verify npm cache
npm cache clean --force
npm cache verify
# now run npm install again
npm install
校验和值
校验和值是从特定文件生成的字母数字哈希值,当文件内容改变时,校验和值也会改变。
在npm
包中,校验和用于验证下载的文件的完整性。
第一次将包安装为依赖项时,npm
将生成每个包的校验和并将其存储在文件中package-lock.json
。
下面是一个例子:
{
"@babel/code-frame": {
"version": "7.16.7",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
"integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
"requires": {
"@babel/highlight": "^7.16.7"
}
}
}
integrity
上面依赖关系图中的属性是通过对code-frame-7.16.7.tgz
文件运行哈希sha512
函数生成的。
npm install
以后运行时,npm
会再次对该code-frame-7.16.7.tgz
文件运行哈希函数,看校验和是否与属性中的一致integrity
。
当值不同时,npm
将抛出EINTEGRITY
错误代码。
这就是删除package-lock.json
文件有效的原因。因为这导致npm
将直接跳过包的校验和比较过程(直到下次npm install
再次运行)
在npm
版本5之前,校验和是用sha1
而不是生成的sha512
。
另外注意,有时npm
也会EINTEGRITY
因为不同的sha
哈希值而产生警告,如下所示:
npm WARN registry Unexpected warning for https://registry.npmjs.org/:
Miscellaneous Warning EINTEGRITY: sha1-UWbihk...TIIM=
integrity checksum failed when using sha1:
wanted sha1-UWbihk...TIIM=
but got sha512-yJHVQEh...pWft6kWBBcqh0UA==. (11423 bytes)
这意味着package-lock.json
文件中有sha1
值,但npm
生成sha512
值。
这种情况下,需要删除node_modules
文件夹和package-lock.json
文件才能解决警告。
如果使用的是旧版本的npm
,请在再次尝试安装之前升级npm
版本:
# upgrade npm version
npm install -g npm@latest
# remove node_modules and package-lock.json
rm -rf node_modules package-lock.json
# Clear and verify npm cache
npm cache clean --force
npm cache verify
# now run npm install again
npm install
依次运行上述命令以解决错误EINTEGRITY
。