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


304

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

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


3
恕我直言,由于缺少“我们应该如何以及何时重新生成yarn.lock文件?”这一问题,该问题(以及以下大多数答案)是不完整的。
MarkHu

1
您现在知道如何以及何时吗?
jayarjo

@MarkHu在这里找到它:yarnpkg.com/lang/zh-CN/docs/yarn-lock/#toc-managed-by-yarn因此,基本上:Your yarn.lock file is auto-generated and should be handled entirely by Yarn. As you add/upgrade/remove dependencies with the Yarn CLI, it will automatically update your yarn.lock file.
jayarjo

Answers:


271

是的,您应该签入它,请参阅从npm迁移

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


33
好发现。我从他们的文档中发现以下内容,这些内容回答“它的作用是什么?”:“ npm客户端不确定地将依赖项安装到node_modules目录中。这意味着,根据安装的顺序依赖关系,node_modules的结构目录可能因人而异。这些差异可能会导致“我的机器上的作品”错误,这些错误需要很长时间才能找到。”
rlay3

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

而不是说“未找到锁文件”。它应该只说“ Generate yarn.lock file”。Duh :)这不是错误,但是前者听起来像是错误。在相反的情况下(后者希望有一个yarn.lock文件,但显然没有),后者将使任何人都感到震惊。
亚历山大·米尔斯

7
我感谢yarn.lock将我们的项目锁定到特定的软件包版本,但是我确实感到遗憾的是使用了“ lock”一词。通常,锁定文件(例如.ldb)是一种将资源一次限制在一个进程中的一种方法,以防止中间更新导致的损坏。绝对不应将此类锁定文件用于版本控制,这可能是大多数关于yarn.lock的困惑的源头。
安东尼

2
我真的不喜欢“您不需要阅读或理解此文件”这一短语。这是维护项目的重要文件。
内森·高斯

83

取决于您的项目是什么:

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

可以在本GitHub问题中找到更详细的描述,例如Yarn的创建者之一。说:

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

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


7
另一方面,在库项目中拥有锁定文件是否不会影响其各自测试的可重复性?
E_net4一直重命名为

1
如果我正确阅读了您的描述,则不是“您的项目是图书馆吗?” 可以用“如果您愿意”回答。它似乎没有缺点,但是如果您具有复杂的devDependencies并且您希望lib的每个开发人员都具有相同的构建和测试脚本,那么它可能会很有用。对?
Pipo

4
由于锁文件不会受到您库的任何用户的尊重,因此在开发库时依靠它可能会带来错误的安全感
VoxPelli

1
Dart与pubspec.yaml和pubspec.lock具有相同的系统,并建议与答案中的相同。请参阅问题和文档条目。
乔纳斯·凯洛

16
请在Yarn的官方博客中查看此条目:锁定文件应在所有项目上提交
E_net4一直都被重命名为

66

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

您是否应该将文件提交到回购中?

是。如ckuijjer的回答中所述,建议在《迁移指南》中将此文件包含在回购中。继续阅读以了解为什么需要这样做。

什么yarn.lock

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

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

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

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

另一方面,纱线采取了最大可预测性的路线。它创建yarn.lock文件来保存确切的依赖版本。将文件放置到位后,yarn将使用中存储的版本,yarn.lock而不是从中解析版本package.json。此策略保证上述所有问题均不会发生。

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


1
但是我偶尔会看到yarn.lock更新,您知道为什么以及何时更新yarn吗?
jayarjo

1
纱线问题#4379#4147建议在许多情况下进行yarn更新yarn.lock,包括在yarn install不更改package.json的情况下运行。yarn install --frozen-lockfile按照“ 为什么在Windows上运行yarn会更改yarn.lock(或通过配置它.yarnrc)”中的建议使用,似乎是最好的选择。
劳里·哈普夫

如今,npm有package-lock.jsonnpm ci。该工作流程类似于yarn yarn.lockyarn install --frozen-lockfile
k0pernikus


8

你应该:

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

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


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


yarn install可能会意外更改您的yarn.lock,从而使可重复构建的纱线声明无效。您应该只用于yarn install初始化yarn.lock并对其进行更新。

另外,特别是 在较大的团队中,可能仅因为开发人员正在设置其本地项目,在纱线锁周围的变化中会有很多杂音。

有关更多信息,请继续阅读 我有关npm的package-lock.json的答案,这也适用于此。


最近在纱线安装文档中也对此进行了明确说明

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.


虽然如此,我能想到的,你会唯一的一次要使用--frozen-lockfile的,如果有人手动更新的package.json没有随后运行yarn install和提交更新。因此,CI可能希望使用该标志,但开发人员不应使用该标志,因为它隐藏了问题。
jkrehm

@jkrehm取决于隐藏问题的意思。对于由yarn.lock引入的意外更改的文件yarn install,我会遇到更大的麻烦,要么膨胀请求,要么造成不必要的合并冲突,要么破坏一个中断的库。(仅因为库使用semvar,并不意味着补丁/次要更新不会破坏您的应用-我去过那里)。我认为更新yarn.lock只应该是一个手动步骤,这就是我甚至在我的开发机器上都依赖yarn install --frozen-lockfile(以及npm ci依赖npm项目)的原因,因为它可靠且确定。
k0pernikus

1
我从来没有遇到过yarn.lock意外更新的问题(自2016年10月发布以来一直在使用)。一直是用户手动执行某项操作或糟糕的安装后脚本。这就是我比NPM更喜欢Yarn的原因(NPM会随时更新所有内容)。我想我很幸运自己没有遇到那些问题。
jkrehm

5

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

从文件

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

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

就像埃里克·埃利奥特(Eric Elliott)在这里说的

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



3

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


1
您提到的npm行为取决于您如何保存依赖项。如果--save-exact在使用npm时使用,则可以实现相同的行为。
AlicanC

4
@AlicanC我不这么认为。我相信yarn(通过已提交的锁定文件)将保证软件包的相同版本及其所有依赖关系。这是NPM一直存在的问题,因为依赖关系的依赖关系可能未固定到特定版本,因此新安装可能会引入不同的较低级别的依赖关系。NPM收缩包装本来可以在某种程度上解决此问题,但它总是很棘手,而且经常无法正常工作。
nextgentech

@nextgentech如果在这种情况下,如何确保依赖关系的依赖关系已正确更新。假设我有一个包含一些(例如3个)依赖程序包的主程序包。我将在主程序包中监视更改,并在package.json中对其进行更新。但是,如果他们更新了3个子软件包中的任何一个,我将如何获得更改?由于存在锁定文件,这些依赖项将不会更新,对吗?
Pragatheeswaran '16

我还没有完全弄清楚它,但是我相信这是yarn upgrade命令起作用的地方。此命令将升级所有软件包并重新创建锁定文件。因此,例如,如果您要将应用程序部署到生产环境中并且需要安装依赖项,则它将基于从存储库中提取的锁定文件进行安装。yarn upgrade除非明确要更改依赖关系信息(从而提交新的锁定文件),否则切勿运行。
nextgentech '16

yarn install不会确保相同的版本。只做yarn install --frozen-lockfile
k0pernikus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.