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

我刚刚生成了一个新的 npm 锁定文件,包锁定。Json 作为我典型工作流程的一部分。但是我注意到,这次所有的完整性散列都从 sha1更改为 sha512。这里发生了什么?

enter image description here

"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==",
[…]
}
80623 次浏览

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

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

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

丢弃 package-lock. json 在 git 中的更改

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

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

另请参阅 https://github.com/npm/npm/issues/17749,虽然它声称问题是“固定的”,但实际上并非如此。删除 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 _ module 文件夹和缓存,然后获取 sha512包锁定。来自 git 的 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 命令作为参考,它和丹尼尔的剧本是一样的:

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(不要移除你的 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_modules: rm -rf node_modules
  3. 清除 npm 缓存: npm cache clean --force
  4. 安装软件包: npm install

这将导致使用 sha512完整性哈希更新 package-lock.json

您可以通过以下修改来解决这个问题:

  1. 确保 npm 版本: 7.x 或以上
  2. 创建一个 .npmrc文件
// .npmrc
lockfile-version=3
  1. 移除你的 node_modules: rm -rf node_modules/
  2. 删除现有的 package-lock.json: rm package-lock.json
  3. 安装 npm 包: npm install

您可以检查集成散列:

$ grep -o 'sha1' package-lock.json | wc -l

这很可能是因为您更改了正在使用的 node版本。 新版本的 npm使用 hash512

在我的案例中,我在一个共享项目中工作,发生的事情是我运行了一个新版本的 npm的 FRESH npm i,这导致我的 package-lock文件被更改为使用 hash512。之后,我刷新了我的分支,即 git reset --hard && git pull,它带给我一个带有 SHA1校验和的 package-lock文件。 因为我仍然有我的 node_modules安装了一个新版本的 npm后,做 git pull我运行的 npm i改变了我的 package-lock文件使用 hash512

Tl; dr 是:

  1. 确保您正在为项目使用正确的节点版本,更喜欢使用 nvm use
  2. rm -Rf node_modules && npm i(必须执行 rm-Rf node _ module,否则将不断更改包锁)

这应该可以保持项目的一致性