我应该提交yarn.lock文件,它的用途是什么?

rla*_*ay3 270 yarnpkg

yarn.lock执行a后,Yarn会创建一个文件yarn install.

这应该提交到存储库还是被忽略?它是为了什么?

cku*_*jer 245

是的,您应该检查它,请参阅从npm迁移

Yarn将在包的根目录中生成yarn.lock文件.您无需阅读或理解此文件 - 只需将其检入源代码管理即可.

  • 很好找.我从他们的[docs](https://code.facebook.com/posts/1840075619545360/yarn-a-new-package-manager-for-javascript/)中找到了以下内容,以回答"它的用途是什么? ":"npm客户端以非确定的方式将依赖项安装到node_modules目录中.这意味着根据安装的顺序依赖项,node_modules目录的结构可能因人而异.这些差异可能会导致"对我有效"机器"需要很长时间才能捕获的错误." (28认同)
  • 接下来:"Yarn通过使用锁定文件和确定性且可靠的安装算法解决了版本控制和非确定性问题.这些锁定文件将已安装的依赖项锁定到特定版本,并确保每个安装都产生完全相同的文件结构.所有机器上的node_modules." (11认同)
  • 我很欣赏yarn.lock将我们的项目锁定到特定的软件包版本,但我确实觉得使用"lock"这个词是不幸的.通常[锁定文件](https://en.wikipedia.org/wiki/File_locking#Lock_files)(例如[.ldb](https://support.microsoft.com/en-sg/help/966848/what-) is-an-ldb-file))是一种将资源限制为一次一个进程的方法,以防止更新可能导致的损坏.这样的锁文件绝对不应该提交给版本控制,这可能是关于yarn.lock的大部分混淆源于此的地方. (5认同)
  • 我真的不喜欢“你不需要阅读或理解这个文件”这句话。这是维护您的项目的重要文件。 (3认同)

Vox*_*lli 72

取决于您的项目是什么:

  1. 您的项目是应用程序吗?然后:是的
  2. 你的项目是图书馆吗?如果是这样的话:

这个GitHub问题中可以找到更详细的描述,其中一个是纱线的创造者,例如.说:

package.json描述了原作者所需的预期版本,而yarn.lock描述了给定应用程序的最后已知良好配置.

仅使用yarn.lock顶级项目的-file.因此,除非一个项目将独立使用而不安装到另一个项目中,否则提交任何yarn.lock文件都没有用- 而是始终由package.json-file来传达项目所期望的依赖项版本.

  • 请在Yarn的官方博客中查看此条目:[锁定文件应在所有项目中提交](https://yarnpkg.com/blog/2016/11/24/lockfiles-for-all) (14认同)
  • 另一方面,库项目中的锁文件是否会影响其各自测试的可重复性? (6认同)
  • 由于您的库的任何用户都不会遵守锁定文件,因此在开发库时依赖它会给人一种虚假的安全感 (4认同)

Jur*_*riy 62

我看到这是两个独立的问题.让我回答两个问题.

你应该把文件提交到repo吗?

是.正如ckuijjer的回答中所提到,迁移指南中建议将此文件包含在repo中.看了就明白了,为什么你需要做到这一点.

什么是yarn.lock

它是一个文件,它存储项目的确切依赖项版本以及每个包的校验和.这是纱线为依赖关系提供一致性的方法.

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

  1. 依赖性作者可能会发布修补程序版本更新,而实际上会引入一个会影响项目的重大更改.

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

另一方面,纱线采用最大可预测性的途径.它创建yarn.lock文件以保存确切的依赖项版本.将该文件放在适当位置纱线将使用存储的版本yarn.lock而不是从中解析版本package.json.该策略保证不会发生上述问题.

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


k0p*_*kus 13

你应该:

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

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


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


yarn install可能会意外地改变您的 yarn.lock,使 yarn 声称可重复构建无效。您应该只用于yarn install初始化 yarn.lock 并更新它。

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

有关更多信息,请阅读我对 npm 的 package-lock.json 的回答,因为这也适用于此处。


最近在yarn install文档中也明确说明了这一点:

yarn install

将 package.json 中列出的所有依赖项安装在本地 node_modules 文件夹中。

yarn.lock文件的用途如下:

  • 如果 yarn.lock 存在并且足以满足 package.json 中列出的所有依赖项,则安装 yarn.lock 中记录的确切版本,而 yarn.lock 将保持不变。Yarn 不会检查更新的版本。
  • 如果 yarn.lock 不存在,或者不足以满足 package.json 中列出的所有依赖项(例如,如果您手动向 package.json 添加依赖项),则 Yarn 会查找满足 package 中约束的最新可用版本.json。结果写入yarn.lock。

如果要确保不更新 yarn.lock,请使用 --frozen-lockfile.


jar*_*kwg 10

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

它用于确定性包依赖性解析.


Ans*_*hul 10

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

从文档

当您运行 yarn 或 yarn add 时,Yarn 将在您的包的根目录中生成一个 yarn.lock 文件。您无需阅读或理解此文件 - 只需将其签入源代码管理即可。当其他人开始使用 Yarn 而不是 npm 时,yarn.lock 文件将确保他们获得与您完全相同的依赖项。

一种争论可能是,我们可以通过替换^--. 是的,我们可以,但总的来说,我们已经看到大多数npm包都带有^符号,我们必须手动更改符号以确保静态依赖版本。但是如果您使用yarn.lock它,它将以编程方式确保您的正确版本。

也正如埃里克·埃利奥特在这里所说的

不要 .gitignore yarn.lock。它是为了确保确定性的依赖解析,以避免“在我的机器上工作”的错误。


Nav*_*sad 7

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


ner*_*ger 6

不是在鼓吹魔鬼,但我已经慢慢(多年来)意识到你不应该提交锁定文件。

我知道他们所说的每一份文件都是你应该做的。但它可能有什么好处?!在我看来,缺点远远大于好处。

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

此外,锁定文件确实会弄乱您的依赖关系树。因为yarn 和npm 创建了一个复杂的树并将不同版本的外部模块保存在不同的位置(例如,在应用程序顶部node_modules 文件夹中模块内的node_modules 文件夹中),如果您频繁更新依赖项,它会造成真正的混乱。同样,我花了大量时间试图找出模块版本已更新的依赖项中仍在使用旧版本的模块,结果发现删除锁定文件和 node_modules 文件夹解决了所有难题- 诊断问题。

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

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

  • “不同用户访问不同注册表的企业环境”我认为这本身就是一场灾难。一个项目应该在所有用户之间共享相同的注册表,否则您会遇到问题。 (2认同)

ena*_*upe 5

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

  • @AlicanC 我认为没那么简单。我相信纱线(通过提交的锁定文件)将保证相同版本的包*及其所有依赖项*。这是 NPM 一直存在的问题,因为依赖项的依赖项可能不会固定到特定版本,因此新安装可能会引入不同的低级依赖项。NPM 收缩包装应该在一定程度上解决这个问题,但它总是很棘手,而且经常无法正常工作。 (4认同)