我应该提交 yarn.lock 文件吗?它有什么用?

Should I commit the yarn.lock file and what is it for?

Yarn 在您执行 yarn install 后创建一个 yarn.lock 文件。

这是应该提交到存储库还是忽略?它有什么用?

我想是的,因为 Yarn 版本自己的 yarn.lock 文件: https://github.com/yarnpkg/yarn

它用于确定性的包依赖解析。

是的,您应该签入,请参阅Migrating from npm

它有什么用?
npm 客户端不确定地将依赖项安装到 node_modules 目录中。这意味着根据安装依赖项的顺序,node_modules 目录的结构可能因人而异。这些差异可能会导致 在我的机器上工作 需要很长时间才能找到的错误。

Yarn 通过使用锁定文件和确定且可靠的安装算法,解决了版本控制和不确定性方面的这些问题。这些锁定文件将已安装的依赖项锁定到特定版本,并确保每次安装都会在 node_modules 中在所有计算机上产生完全相同的文件结构。

是的! yarn.lock 必须签入,这样任何安装依赖项的开发人员都会获得完全相同的输出!例如,使用 npm [2016 年 10 月可用],你可以有一个 patch 版本(比如 1.2.0)在本地安装,而新开发者 运行 新 install 可能会得到不同的版本 (1.2.1)。

取决于你的项目是什么:

  1. 您的项目是应用程序吗?然后:
  2. 你的项目是库吗?如果是:

可以在 this GitHub issue 中找到更详尽的描述,其中 Yarn 的创建者之一,例如。说:

The package.json describes the intended versions desired by the original author, while yarn.lock describes the last-known-good configuration for a given application.

仅使用顶级项目的 yarn.lock 文件。因此,除非一个项目将独立使用并且不会安装到另一个项目中,否则提交任何 yarn.lock 文件都是没有用的——相反,它将始终由 package.json 文件来传达什么版本项目期望的依赖项。

我看到这是两个独立的问题合二为一。让我回答两个。

你应该将文件提交到 repo 中吗?

是的。如 it is recommended in Migration Guide 中所述,将此文件包含到 repo 中。继续阅读以了解为什么您需要这样做。

什么是yarn.lock

它是一个文件,用于存储项目的确切依赖版本以及每个包的校验和。这是 yarn 为您的依赖项提供一致性的方式。

要了解为什么需要此文件,您首先需要了解原始 NPM package.json 背后的问题是什么。安装包时,NPM 将存储依赖项的允许修订范围,而不是特定修订 (semver)。 NPM 将尝试在指定范围内获取更新依赖项的最新版本(即非破坏性补丁更新)。这种方法有两个问题。

  1. 依赖项作者可能会发布补丁版本更新,同时实际上引入了会影响您的项目的重大更改。

  2. 两个开发人员 运行 npm install 在不同的时间可能会得到不同的依赖集。这可能会导致错误无法在两个完全相同的环境中重现。例如,这可能会导致 CI 服务器的构建稳定性问题。

另一方面,Yarn 走的是最大可预测性的路线。它创建 yarn.lock 文件来保存 exact 依赖版本。将该文件放置在 yarn 中将使用存储在 yarn.lock 中的版本,而不是解析来自 package.json 的版本。此策略可确保 none 上述问题发生。

yarn.lock类似于npm-shrinkwrap.json,可以通过npm shrinkwrap命令创建。检查 解释这两个文件之间的差异。

根据我的经验,我会说是的,我们应该提交 yarn.lock 文件。它将确保当其他人使用您的项目时,他们将获得与您的项目预期相同的依赖项。

From the Doc

When you run either yarn or yarn add , Yarn will generate a yarn.lock file within the root directory of your package. You don’t need to read or understand this file - just check it into source control. When other people start using Yarn instead of npm, the yarn.lock file will ensure that they get precisely the same dependencies as you have.

有人认为,我们可以通过用 -- 替换 ^ 来实现它。是的,我们可以,但总的来说,我们已经看到大多数 npm 包都带有 ^ 符号,如果您使用 [=,我们必须手动更改符号以确保静态依赖性 version.But 10=] 它将以编程方式确保您的版本正确。

也正如 Eric Elliott 所说 here

Don’t .gitignore yarn.lock. It is there to ensure deterministic dependency resolution to avoid “works on my machine” bugs.

是的,你应该提交。有关 yarn.lock 文件的更多信息,请参阅官方文档 here

你应该:

  1. 将其添加到存储库并提交
  2. 使用 yarn install --frozen-lockfile 而不是 yarn install 作为本地和 CI 构建服务器上的默认值。

(我在 yarn 的问题跟踪器上开了一张票,以证明冻结锁定文件的默认行为,请参阅 #4147)。


注意不要在 .yarnrc 文件中设置 frozen-lockfile 标志,因为那样会阻止您同步 package.json 和 yarn.lock 文件。查看相关 yarn issue on github


yarn install may mutate your yarn.lock unexpectedly,使可重复构建的 yarn 声明无效。您应该只使用 yarn install 来初始化 yarn.lock 并更新它。

此外,尤其是。在较大的团队中,您可能会因为开发人员正在设置他们的本地项目而对 yarn lock 的更改产生很多噪音。

有关更多信息,请阅读 ,因为这也适用于此处。


最近在 docs for yarn install:

中也明确指出了这一点

yarn install

Install all the dependencies listed within package.json in the local node_modules folder.

The yarn.lock file is utilized as follows:

  • If yarn.lock is present and is enough to satisfy all the dependencies listed in package.json, the exact versions recorded in yarn.lock are installed, and yarn.lock will be unchanged. Yarn will not check for newer versions.
  • If yarn.lock is absent, or is not enough to satisfy all the dependencies listed in package.json (for example, if you manually add a dependency to package.json), Yarn looks for the newest versions available that satisfy the constraints in package.json. The results are written to yarn.lock.

If you want to ensure yarn.lock is not updated, use --frozen-lockfile.

不是唱反调,但我(多年来)慢慢接受了您不应该提交锁定文件的想法。

我知道他们所有的文档都说你应该这样做。但是它能有什么好处呢?!在我看来,缺点远远大于好处。

基本上,我花了无数个小时调试最终通过删除锁定文件解决的问题。例如,锁定文件可以包含有关使用哪个包注册表的信息,在不同用户访问不同注册表的企业环境中,这是灾难的根源。

此外,锁定文件确实会弄乱您的依赖关系树。因为 yarn 和 npm 创建了一个复杂的树并将不同版本的外部模块保存在不同的地方(例如,在应用程序顶部 node_modules 文件夹中的模块中的 node_modules 文件夹中),如果您经常更新依赖项,它会造成真正的混乱。同样,我花了很多时间试图弄清楚模块版本已更新的依赖项中仍在使用哪些旧版本的模块,结果发现删除了锁定文件和 node_modules 文件夹解决了所有 hard-to-diagnose 个问题。

我现在甚至有 shell 个别名,可以在 运行 yarn 或 npm 之前删除锁定文件(有时 node_modules 文件夹!)。

我猜只是硬币的另一面,但是盲目地遵循这个教条会让你付出代价......