我该织纱线吗?锁定文件,它是干什么用的?

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

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

196328 次浏览

我想是的,因为Yarn版本自己的Yarn。锁文件: https://github.com/yarnpkg/yarn < / p >

它用于确定包依赖项解析。

是的,你应该签入它,见从npm迁移

< p > 这是干什么用的? < br > npm客户端非确定地将依赖项安装到node_modules目录中。这意味着根据所安装依赖项的顺序,node_modules目录的结构可能因人而异。这些差异会导致works on my machine错误,需要很长时间才能找到

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

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

取决于你的项目是什么:

  1. 你的项目是一个应用程序吗?然后:是的
  2. 你的项目是图书馆吗?如果是:没有

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

包。Json描述了原作者所期望的版本,而yarn。Lock描述给定应用程序的最后一个已知良好配置。

只有顶层项目的__abc0文件将被使用。因此,除非一个项目将被单独使用,并且不会被安装到另一个项目中,否则提交任何yarn.lock-file都是没有用的——相反,它总是由package.json-file来传达项目期望的依赖项版本。

我看这是两个独立的问题。我来回答两个问题。

你应该把文件提交到回购吗?

是的。正如ckuijjer的回答中提到的,建议在迁移向导中将此文件包含到repo中。继续阅读以理解你需要做的为什么

yarn.lock是什么?

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

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

  1. 依赖项作者可能会发布补丁版本更新,而实际上引入了一个会影响您的项目的破坏性更改。

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

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

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

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

来自医生

当您运行纱线或纱线添加时,yarn将生成一个纱线。在包的根目录中锁定文件。您不需要阅读或理解此文件—只需将其签入源代码控制。当其他人开始使用Yarn而不是npm时,Yarn。锁文件将确保他们得到完全相同的依赖,因为你有。

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

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

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

是的,你应该承诺。了解更多关于纱线的知识。锁文件,参考官方文档在这里

你应该:

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

(我在yarn的问题跟踪器上打开了一个ticket,以使freeze -lockfile默认行为,参见# 4147)。


注意不要在.yarnrc文件中设置frozen-lockfile标志,因为这会阻止你同步包。Json和yarn。锁文件。参见相关的纱线问题在github上


yarn install可能会变异你的纱线。锁意外,使可重复构建的纱线声明无效。你应该只使用yarn install来初始化一个yarn。锁定并更新它。

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

欲了解更多信息,请阅读我对npm的package-lock.json的回答,因为它也适用于这里。


最近在纱线安装文件中也明确了这一点:

yarn install

安装package.json中列出的所有依赖项

.在本地node_modules文件夹

yarn.lock文件的使用方式如下:

    <李>如果纱线。锁是存在的,它足以满足所有的依赖关系 在包装中列出。Json,在yarn中记录的确切版本。锁是 装、纱。锁将不变。纱线不会检查 李新版本。< / > <李>如果纱线。锁是缺席,还是不够满足 包中列出的所有依赖项。Json(例如,如果您 手动添加一个依赖到package.json), Yarn会寻找最新的 满足package.json中约束的可用版本。的 结果被写入yarn.lock.

如果你想保证纱线。锁没有更新,使用--frozen-lockfile.

不是要唱反调,但是我已经慢慢地(在过去的几年里)意识到你不应该提交锁文件。

我知道他们所有的文件都说你应该这么做。但这又能有什么用呢!在我看来,弊远大于利。

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

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

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

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