为什么 package-lock.json 将完整性散列从 sha1 更改为 sha512?

Why did package-lock.json change the integrity hash from sha1 to sha512?

我刚刚生成了一个新的 npm 锁文件 package-lock.json,作为我典型工作流程的一部分。但我注意到这次所有的完整性哈希值都从 sha1 更改为 sha512。这里发生了什么?

"chalk": {
    "version": "2.0.1",
    "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz",
-   "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=",
+   "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
    […]
}

据我所知,npm 将完整性校验和从 sha1 更改为 sha512。

如果您的 git 更改是从 sha1 到 sha512,您应该进行一次更新,之后就可以了。

如果其他人使用代码库并看到 git 从 sha512 更改为 sha1(这是我遇到的问题),您可以通过 运行 以下方法修复它:

放弃包 git 中的更改-lock.json

npm i -g npm
rm -rf node_modules/
npm i

这将更新 npm 并重新安装所有软件包,以便出现新的校验和 (sha512)。

另见 https://github.com/npm/npm/issues/17749,虽然声称问题是 'fixed',但事实并非如此。删除 node_modules 是一种解决方法。

可能与操作系统有关系。我们现在正在与 Linux 和 Windows 平台上的开发人员一起解决这个问题。

基于 Dave 的回答。我找到的修复方法是执行以下操作:

npm i -g npm

cd {working directory}
rm -rf node_modules/
rm package-lock.json
npm cache clear --force
npm i

我们同时为所有开发人员执行了此操作,这阻止了导致令人沮丧的合并冲突的 sha-512 与 sha-1 问题。

进一步建立在之前的评论和建议的基础上,对我来说,我需要擦除现有的 node_modules 文件夹、缓存,然后从 git 中获取 sha512 包-lock.json 文件(这是从另一台计算机提交的),最后做一个 npm i。像这样:

npm i -g npm
rm -rf node_modules/
npm cache clear --force
git reset --hard
npm i

在这个包之后-lock.json 使用了 sha512 和其他稳定的变化。

作为@Daniel Cumings,我还必须删除 package-lock.json 以摆脱 sha1 哈希。以下是 Windows CLI 命令 供参考,它与 Daniel 的脚本相同:

npm i -g npm
rd /s /q "node_modules"
del package-lock.json
npm cache clear --force
npm i

我在大团队工作。强制每个开发人员强制清理 npm 缓存是困难且不可靠的。此外,这并非每次都有帮助。因此,对于仍然面临这个 npm 问题(和我一样)并且没有其他帮助的人 - 试试我最近构建的这个基于 git 的工具:https://github.com/kopach/lockfix。它恢复 npm 锁定文件的 sha512 -> sha1 完整性更改。如果将此添加到 package.jsonpostshrinkwrap 脚本中 - 您最终应该将所有完整性属性设置为 sha512 并使锁定文件保持一致。

npm install --save-dev lockfix
"scripts": {
    "postshrinkwrap": "lockfix",
},

在我的情况下 npm -g i npm 还不够,我不得不修改 PATH 以在开始时指向新的 npm。

要在不修改的情况下检查它,请尝试 /usr/local/bin/npm i 而不是 npm i

如果您使用的是 npm v5 或更高版本,并且您看到完整性哈希值从 sha512 变回 sha1,一种补救方法 无需 删除您的 package-lock.json 是为了执行以下操作:

  1. 从您的 package-lock.json () 中删除所有 sha1 完整性哈希;例如:
    diff --git a/package-lock.json b/package-lock.json
    index 6374e258..05f77ec8 100644
    --- a/package-lock.json
    +++ b/package-lock.json
    @@ -56,12 +56,10 @@
         "@babel/core": {
           "version": "7.9.6",
           "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz",
    -      "integrity": "sha1-X+QF1VU04G078GD4anmTXNpfZhU="
         },
         "@babel/parser": {
           "version": "7.9.6",
           "resolved": "https://registry.npmjs.org/npm-adobe-release/@babel/traverse/-/traverse-7.9.6.tgz",
    -      "integrity": "sha1-fGzlDyLGPvCJNpHXPZrCdGz7QSY="
         },
    
  2. 删除你的node_modulesrm -rf node_modules
  3. 清除 npm 缓存:npm cache clean --force
  4. 安装软件包:npm install

这应该会导致您的 package-lock.json 更新为 sha512 完整性哈希。