删除 `package-lock.json` 以快速解决冲突

Posted

技术标签:

【中文标题】删除 `package-lock.json` 以快速解决冲突【英文标题】:Deleting `package-lock.json` to Resolve Conflicts quickly 【发布时间】:2019-06-05 01:09:36 【问题描述】:

在团队设置中,我通常在package-lock.json 中遇到合并冲突,而我的快速解决方法一直是删除文件并使用npm install 重新生成它。我没有认真考虑过这个修复的含义,因为它之前没有引起任何可察觉的问题。

删除文件并让npm 以这种方式重新创建它而不是手动解决冲突是否有问题?

【问题讨论】:

参考这个答案 - ***.com/a/44297998/2251411 @john-mutuma 由于 npm 的解决方案比接受的答案要简单得多,也许您应该考虑接受下面的(我的)解决方案 :-) 为什么要浪费时间在可以为您解决很多问题的事情上更轻松? :-) 【参考方案1】:

是的,它可以并且将以非常糟糕的方式影响所有项目。

    如果您的团队没有在每个 git pull 之后运行 npm install,那么您都在使用不同的依赖项版本。所以它以“但它对我有用!!”结尾和“我不明白为什么我的代码不适合你”

    即使所有团队都运行npm install,但这并不意味着一切正常。在某些时候,您可能会发现您的项目表现不同。在你多年来没有改变的部分。在(可能非常痛苦)调试之后,您会发现这是因为 3 级依赖项已针对下一个主要版本进行了更新,这导致了一些重大更改。

结论:永远不要删除package-lock.json

是的,对于第一级依赖项,如果我们指定它们没有范围(如"react": "16.12.0"),我们每次运行npm install 时都会得到相同的版本。但是我们不能对 2+ 级深度的依赖项(我们的依赖项所依赖的依赖项)说同样的话,所以package-lock.json 对稳定性非常重要。

在你的情况下,你最好做下一个方法:

    修复package.json中的冲突 运行npm install

看起来很简单。与 yarn 一样——它自己修复了 lockfile 冲突。这里唯一的要求是提前解决package.json 中的所有冲突(如果有)。

根据docs,npm 将为您修复package-lock.json 中的合并冲突。

[2021 年更新] 重要!如果你已经使用了一些库,并且它的维护者的 npm/GitHub 帐户被黑了。并且发布了包含恶意代码的新版本。你有package-lock.json 完好无损。你会好起来的。如果你放弃它,你就有麻烦了。

【讨论】:

使用方法 2,我注意到它很容易导致我最终使用方法 1 的问题,所以我建议首先使用方法 1。 @toni_lehtimaki 为什么基本上是一样的?如果您选择首先基于当前的package-lock.json 进行变基或在合并时接受“他们的”package-lock.json,它们实际上是相同的。还是我在这里遗漏了什么? @JRichardsz,您仍然没有显式控制传递(间接,2nd+ 级)依赖项 这个答案的最后一行是关键。在拉出并看到合并冲突仅在 package-lock.json 文件中之后,您可以执行 npm install 并为您解决它们(然后您只需要暂存/提交/等)。 TIL :) 感谢您的提示! 等等,无需解决yarn.lock 内部的冲突。仅在 package.json 内部【参考方案2】:

是的,它可能会产生不好的副作用,可能不是很常见,但例如您可以在 package.json 中拥有 "moduleX": "^1.0.0",而您曾经在 package-lock.json 中拥有 "moduleX": "1.0.0"

通过删除 package-lock.json 并运行 npm install,您可能会在不知情的情况下更新到 moduleX 的 1.0.999 版本,并且可能他们已经创建了一个错误或进行了向后的重大更改(不遵循语义版本控制)。

反正已经有标准解决方案了。

    修复package.json内部的冲突 运行:npm install --package-lock-only

查看此链接了解更多信息:

https://docs.npmjs.com/cli/v6/configuring-npm/package-locks#resolving-lockfile-conflicts

【讨论】:

如果“moduleX”需要为 1.0.0(不是更大),那么不应该在 package.json 中指定 1.0.0 而不是 ^1.0.0 吗? @SendETHToThisAddress 我不相信算命 当 moduleX 最初安装在 1.0.0 版本并且没有任何更新的版本时,你怎么知道未来的版本会破坏某些东西还是只是修复错误??【参考方案3】:

我知道这是一个老问题,但对于未来的寻求者,您还可以使用 npm-merge-driver 尝试自动解决 npm 相关文件的合并问题。

只需全局安装npx npm-merge-driver install --global。你可以在这里阅读更多关于它的信息npm-merge-driver

编辑:只是想警告对使用上述软件包感兴趣的人,有时它的行为可能会出现异常且难以删除。所以虽然它是一个有用的工具,但它仍然需要一些工作。

编辑:此存储库现在已存档且只读。

【讨论】:

以上是关于删除 `package-lock.json` 以快速解决冲突的主要内容,如果未能解决你的问题,请参考以下文章

如何解决找到的`package-json。 ...要清除此警告,请删除 package-lock.json`,我认为它在 yarn install 时被 npm 覆盖

很多人上来就删除的package-lock.json,还有这么多你不知道的(深度内容)

如何禁用package-lock

npm install时不改变package-lock.json的做法

npm install没有创建一个新的package-lock.json

package-lock.json和yarn.lock是您最好的朋友