YARN install正常但NPM install失败,二者在此场景下的工作差异
当前目录仅包含以下两个文件:
package.json 内容
{ "name": "npm-yarn", "dependencies": { "@sap/dwf-dws-client": "~2.6.0" }, "engines": { "node": "^12 || ^14" } }
.npmrc 内容
@sap:registry=https://registry.npmjs.org
执行npm install时出现如下错误:
npm WARN tarball tarball data for @sap/xssec@2.2.5 (sha512-hGE9+PFNqeW3U5tC0gbV4Fn1B69D2aWo3xPzQ9baVZkuG0a+yOaL+t6bwJetfTwdwmW5Pts9o2egGEQBW3I5Xg==) seems to be corrupted. Trying one more time. npm ERR! code EINTEGRITY npm ERR! sha1-aMV30QoSZ5yaXDw1FbIhFuJ3Lq8= integrity checksum failed when using sha1: wanted sha1-aMV30QoSZ5yaXDw1FbIhFuJ3Lq8= but got sha512-3fuRTVJq3FYNDbfzavMQFSuSb+n9T42zsqXMvqNPv3z/9+0h6zzAFX3W+Rr3Xn8agKCwgeBU7FDClOiaWB7IRg== sha1-wsWT8RsLAMyqF+/wRTc5Lr3aEbQ=. (20614 bytes)
但执行yarn install可正常完成,请问YARN与NPM在此场景下的工作机制有何不同?
这里的核心区别在于两者在校验和验证、缓存管理、依赖解析流程上的逻辑不同:
校验和验证逻辑
NPM在该场景下尝试用SHA-1校验和验证包完整性,但实际拉取的包对应的SHA-1值与预期不符,直接抛出错误终止安装。而YARN默认优先使用更安全的SHA-256/SHA-512哈希校验,同时对校验不匹配的情况有更灵活的容错逻辑——如果某哈希值不匹配,它会尝试用其他可用哈希算法重新验证,或者直接重新拉取包而非直接终止流程。缓存机制
NPM的缓存可能留存了之前损坏或哈希不匹配的包文件,再次安装时直接读取缓存导致校验失败;而YARN的缓存结构与校验逻辑更严谨,会自动检测缓存内的包是否有效,一旦发现不匹配就会重新从registry拉取正确包,不会复用有问题的缓存文件。依赖解析与包拉取流程
NPM处理@sap这类scoped包时,结合.npmrc配置后,可能在哈希值传递或验证环节出现版本不匹配问题(比如旧锁文件或缓存中的哈希值与当前registry返回的不一致);而YARN解析scoped包的registry配置时,会重新从指定registry获取最新的包元数据和哈希值,确保拉取的包与校验信息完全对应,不会出现哈希不匹配的情况。
另外,你使用的Node版本(12/14)对应的NPM版本相对老旧,对新哈希算法的支持不如YARN完善,也是潜在诱因——旧版NPM更依赖SHA-1,而registry上的包已更新为使用SHA-512哈希,从而引发校验失败。
内容的提问来源于stack exchange,提问作者Mani

