我应该提交 yarn.lock 和 package-lock.json 文件吗?

Posted

技术标签:

【中文标题】我应该提交 yarn.lock 和 package-lock.json 文件吗?【英文标题】:Should I commit yarn.lock and package-lock.json files? 【发布时间】:2017-11-17 01:16:23 【问题描述】:

我们在所有确定性 pkg 安装中都使用 yarn,但不会阻止用户使用 npm - 我猜这两个文件都会导致问题。是否应该将一个添加到您的 .gitignore 目录中?

【问题讨论】:

Should I commit the yarn.lock file and what is it for?的可能重复 【参考方案1】:

通常总是提交依赖锁文件

与其他地方的covered 一样,依赖锁定文件,许多包管理系统都支持这些文件(例如: composer 和 bundler),应该提交到链末端项目中的代码库 - 以便每个尝试运行该项目的人都使用经过测试的依赖项集完全这样做。

是否应该始终将锁定文件提交到旨在包含在其他项目中的包中(其中需要更松散的依赖关系),这一点不太清楚。但是,Yarn 和 NPM(如 @Cyrille 所涵盖)会在必要时分别智能地忽略 yarn.lockpackage-lock.json,从而确保始终提交这些锁文件是安全的。

因此,您应该始终提交yarn.lockpackage-lock.json 中的至少一个,具体取决于您使用的包管理器。

你应该同时提交 yarn.lock 和 package-lock.json 吗?

目前我们有两个不同的包管理系统,它们都从package.json 安装同一组依赖项,但它们从两个不同的锁文件生成和读取。 NPM 5 生成 package-lock.json,而 Yarn 生成 yarn.lock

如果您提交 package-lock.json,那么您正在构建支持人们使用 NPM 5 安装您的依赖项。如果您提交 yarn.lock,那么您正在构建支持人们使用 Yarn 安装依赖项。

您是选择提交yarn.lock 还是package-lock.json 或两者都提交取决于在您的项目上开发的人是仅使用Yarn 还是NPM 5 或两者兼而有之。如果您的项目是开源的,那么对社区最友好的做法可能是同时提交两者并拥有一个自动化流程以确保 yarn.lockpackage-lock.json 始终保持同步。

更新: Yarn 现在引入了an import command,它将从package-lock.json 文件生成yarn.lock 文件。这对于保持两个文件同步很有用。 (感谢@weakish)


在 Yarn 项目中详细讨论了这个问题:

"Idea: support package-lock.json from npm 5" "Competing lockfiles create poor UX"

现在两个都关门了。

【讨论】:

很好的答案。但是,关于您的观点:“最安全的做法是在每次依赖项更改时生成并提交它们。”我不确定为什么这是“最安全”的做法.正如您所提到的,很可能“这两个文件可能会不同步。”@crimbo 的回答更详细地解释了这个问题。 我认为这可能是您能否控制所有运行项目的人的区别。如果你拥有团队,当然,标准化 Yarn 并使用 yarn.lock。 但是如果它是一个开源项目(就像我们所有人一样),人们很可能会在你的项目中使用 NPM,即使你在内部使用 Yarn。因此,最安全的理想做法是使用自动化系统来确保 yarn.lock 和 package-lock.json 保持同步。并且还给 Yarn 施压,让他们改用 package-lock.json。 yarn import 于 2018 年推出。yarnpkg.com/blog/2018/06/04/yarn-import-package-lock【参考方案2】:

您应该提交 1 个依赖树锁定文件,但不应同时提交两个。这还需要对 yarn 或 npm(不是两者)进行标准化来构建和开发项目。

Here's the yarn article on why yarn.lock should be committed, if you standardize on yarn.

如果您同时提交 yarn.lock 文件和 package-lock.json 文件,那么这两个文件可以通过多种方式提供不同的依赖树(即使 yarn 和 npm 的树解析算法相同),而且它不是-确保他们提供完全相同的答案很简单。由于这很重要,因此不太可能在两个文件中维护相同的依赖树,并且您不希望根据构建是使用 yarn 还是 npm 来实现不同的行为。

如果当 yarn 从使用 yarn.lock 切换到 package-lock.json (issue here) 时,选择要提交的锁文件变得容易,我们不再需要担心 yarn 和 npm 会导致不同的构建。 Based on this blog post,这是我们不应该很快预料到的变化(博文还描述了yarn.lockpackage-lock.json 之间的区别。

【讨论】:

【参考方案3】:

我也在考虑同样的问题。这是我的想法,希望对你有帮助:

npm package-lock.json documentation 表示以下内容:

package-lock.json 会自动为 npm 修改 node_modules 树或 package.json 的任何操作生成。它描述了生成的确切树,以便后续安装能够生成相同的树,而不管中间依赖项更新如何。

这很好,因为它可以防止“在我的机器上工作”效果。

没有这个文件,如果你npm install --save A,npm 会将"A": "^1.2.3" 添加到你的package.json。当其他人在你的项目上运行npm install 时,A 的版本1.2.4 可能已经发布。由于它是满足package.json 中指定的 semver 范围的最新可用版本,因此它将安装此版本。但是如果这个版本中引入了一个新的错误怎么办?这个人会有一个你无法重现的问题,因为你有以前的版本,没有任何错误。

通过修复node_modules 目录的状态,package-lock.json 文件可以防止此问题,因为每个人都将拥有每个包的相同版本。

但是,如果你正在编写和发布一个 npm 模块呢?文档说明如下:

关于 package-lock.json 的一个关键细节是它不能被发布,如果在***包以外的任何地方找到它都会被忽略。

所以,即使你提交它,当用户安装你的模块时,他/她也不会得到package-lock.json文件,而只会得到package.json文件。因此 npm 将安装满足所有依赖项的 semver 范围的最新版本。这意味着您总是希望使用这些版本的依赖项来测试您的模块,而不是您开始编写模块时安装的那个。所以,在那种情况下,package-lock.json 显然是没用的。更多,这可能很烦人。

【讨论】:

【参考方案4】:

这是我的经验法则:如果您正在处理应用程序,请提交锁定文件。如果您正在维护一个库,请将其添加到您的忽略列表中。无论哪种方式,您都应该在 package.json 中使用准确的 semver 范围。 Yehuda Katz (cached) 对何时提交 Gemfile.lock(Ruby 的锁定文件)以及何时不提交做了很好的解释。至少阅读 tl;dr 部分。

【讨论】:

npm 或 yarn 的忽略列表在哪里? "ignore list" 将特定于您项目的源存储库(git、mercurial、Subversion)。对于 git,文件名为 .gitignore,通常位于项目的根目录。【参考方案5】:

你是对的!允许同时使用 npmyarn 会导致问题。看看this article。

目前,我们计划向在同一存储库中同时使用yarnnpm 来安装软件包的用户添加一些警告

如果您决定使用 yarn,我们强烈建议您删除 package-lock.json 文件,以避免将来出现混淆和可能的一致性问题。

您可能不希望 npmyarn 作为您的包管理器。

【讨论】:

【参考方案6】:

这些文件由您的工具管理,因此——假设使用 yarn 将有效地更新 package-lock.json——我想提交这两个文件都可以正常工作。

我认为对您的用户最重要的是package-lock.json(例如,我不使用纱线)所以这个必须提交。

对于yarn.lock,这取决于您是单独工作还是团队合作。如果是单独的,那么我想没有必要提交它。如果你(计划)在一个团队中工作,那么你可能应该提交它,至少在 yarn supports it ?

我猜 yarn 团队最终会停止使用yarn.lock 并改用package-json.lock,这时候会变得更简单?

【讨论】:

并没有停止使用 yarn.lock。【参考方案7】:

不,同时使用两个锁定文件通常会导致依赖关系树出现不一致,尤其是在团队协作时。忽略一个锁或另一个是一个简单的解决方案。只需确保您的团队理解并同意此更改即可。

【讨论】:

以上是关于我应该提交 yarn.lock 和 package-lock.json 文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

yarn

为啥我的项目同时有 package-lock.json 和 yarn.lock 文件?

yarn.lock 和 npm 的 package-lock 有啥区别?

yarn - 快速检查 `package.json` 和 `yarn.lock` 要求是不是满足的正确方法?

将 yarn.lock 同步回 package.json 并锁定

如何将`yarn.lock`与`package.json`同步?