科技 · 实用指南
npm 报 EINTEGRITY?重置前先追踪预期与实际收到的 tarball
校验和不一致可能来自旧 lock 条目、损坏的本地缓存、私有 registry 或代理返回了不同字节,也可能是包元数据变化。先保留证据,确认精确来源,再只修复失败边界。

EINTEGRITY 表示 npm 对收到的包字节计算出的摘要,与它预期的摘要不同。这个错误是证据,不是让你立刻删 package-lock.json、关闭 TLS 检查或清空全部缓存的指令。
建立字节来源账本:保存失败包、wanted 与 got 摘要、字节数、lockfile 的来源与 integrity、当前 registry、npm 版本,以及一次隔离缓存重试结果。
把不匹配保存成来源记录
记录包名、版本、wanted/got 摘要、字节数、npm 与 Node 版本、命令、平台和 debug log 路径。读取 registry 与 cache 配置,但不要泄露 token。
在 package-lock.json 中找到失败条目的 resolved 与 integrity。lockfile 是预期一侧;测试实际收到的数据时先保持它不变。
清理前先验证本地缓存
运行 npm cache verify 与 npm doctor cache。npm 说明缓存按内容寻址并执行完整性检查,因此验证或自动重新获取的结果会改变诊断方向。
用新的空缓存目录重复同一安装。若成功,隔离并窄范围修复旧缓存;若仍得到同一个 got 摘要,旧缓存不是唯一来源。
比较直连与当前 registry 路径
根据 resolved URL 与 registry 配置确认 npm 实际经过 npmjs、私有 registry、Verdaccio、Azure Artifacts 或其他代理。不要通过关闭 strict SSL 隐藏错误。
在受控环境分别经批准的直连路径和当前代理获取同一包,计算 SHA-512,并比较字节数、重定向和内容类型。测试期间不要发布或替换包。
区分 lockfile 漂移、缓存损坏与 registry 变化
若隔离缓存收到的字节与 lockfile 一致,边界在旧缓存或本地文件系统。若直连符合而代理不符合,保留代理日志,只失效受影响的 artifact。
若两个批准来源都不符合已提交的 integrity,调查版本或来源是否被重新发布、错误镜像或有意变更。只有团队接受该来源变化后才重建 lockfile。
用可复现的 CI 证据收尾
使用已提交的 lockfile 和同一批准 registry 重试 npm ci 或 npm install。记录退出码、registry、缓存路径和最终摘要,确认 lockfile 没有意外变化。
CI 缓存键应区分 lockfile hash 与 registry,并保留第一次失败日志。删除证据后重试变绿,并不能解释为何收到不同字节。
