使用 yarn berry 时将 .yarn 目录提交到 git

Posted

技术标签:

【中文标题】使用 yarn berry 时将 .yarn 目录提交到 git【英文标题】:Committing .yarn directory to git when using yarn berry 【发布时间】:2020-11-09 01:35:45 【问题描述】:

在 yarn ("berry") 的下一个版本中,manual 声明应该只提交创建的名为 .yarn 的目录,但如果您使用 yarn 的多版本设置,则此目录包含文件 @ 987654323@ 好像是整个 berry 版本的 yarn,占用磁盘超过 2MB。

这似乎真的错了——我为什么要向 git 提交一个包管理器,只是为了让它工作?

【问题讨论】:

许多人对纱线浆果不满意。我只使用经典的 yarn / npm。这个新版本的纱线让事情变得更加复杂:/ 谢谢,@Konrad。我认识你吗? 这个概念让我想起了 Gradle 包装器。一个带有版本引用和散列的简单锁定文件,这样 yarn 可以从零状态引导并获取脚本——这将是直接的选择。不知道为什么他们认为使用它们的依赖项发送垃圾邮件提交是明智的。这适用于部署,但不适用于版本控制。 【参考方案1】:

我为那些不想将 Yarn 2+ 二进制文件提交到他们的 git 存储库中的人编写了一个小工具,同时仍然从每个项目的 Yarn 版本中受益。如果你已经在你的项目中配置了 Yarn 2+ 只是不想提交它,你可以运行:

yarn dlx pinyarn

此命令将生成您应该提交的.pinyarn.js (4KB)。 .pinyarn.js 将包含从官方 Yarn Berry GitHub 存储库下载 Yarn 2+ 及其插件的 URL。如果尚未下载,.pinyarn.js 将从这些 URL 下载二进制文件和插件。

您还可以通过以下方式指定所需的 Yarn 2+ 版本:

yarn dlx pinyarn 3 - 最新发布的 Yarn 3 版本,或者

yarn dlx pinyarn 2.2.2 - 版本 2.2.2,或

yarn dlx master - 来自最新来源的版本,或

yarn dlx 1638 - 来自 Pull Request 1638 的版本

GitHub 上的 pinyarn 工具仓库: https://github.com/sysgears/pinyarn

【讨论】:

很高兴您正在做某事,但在弄清为什么纱线首先需要这个之前,我会等待使用您的解决方法。【参考方案2】:

Yarn 开发人员在 the Installation docs 的“关于全局安装”部分解释了这样做的理由:

在整个系统中使用单个包管理器一直是个问题。为了稳定,安装需要跨环境使用相同的包管理器版本运行,否则我们会在版本之间引入意外的破坏性更改的风险 - 毕竟,这就是首先引入锁定文件概念的原因!从某种意义上说,Yarn 是您的第一个项目依赖项,因此“锁定它”也应该是有意义的。

一旦 Yarn 被跟踪并“锁定”为每个项目的依赖项,如果您关注 Yarn 2 的 zero-install strategy, the rationale for which is explained here,它最终会被提交给 Git。

我是 Yarn 的新手,但我花了数年时间从事开发运维工作,帮助开发人员弄清楚为什么他们的代码有时会在团队的一半笔记本电脑上正确构建,而在另一半笔记本电脑上却不能正确构建,或者突然开始无法构建CI同时继续在其他地方工作。试图在公司的每台计算机和代码库中保持npm 的版本一致基本上是不可能的,因为 Node 一直在升级,但是将每个项目锁定到其自己特定的 Yarn 版本——通过致力于 Git , 保证在该项目的每次结帐时都可用 - 解决了这个问题。

【讨论】:

我发现这种默认方法真的很奇怪。我不希望纱线成为我项目的一部分,我宁愿它是一个系统依赖项。为什么 yarn 不能只将版本写入 yarn.lock,然后自动尝试使用该版本(如果可用),否则抛出错误/警告。 我没有时间做研究,但我相信如果你禁用 Yarn 的“零安装”,你会得到像你描述的那样的行为。不确定 Yarn 是否会警告您,但您可以为此编写一个脚本。但是会发生的是,Yarn 会更新,你的构建脚本会立即到处中断,你将有一个紧急任务来升级每个开发者盒子和构建系统上的 Yarn。我去过!【参考方案3】:

官方文档提到了应该忽略什么以及应该提交什么。我认为它可以解决这个问题。 https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored

【讨论】:

我看到了这个页面,它说你应该提交 yarn2 代码。恕我直言,这没有多大意义。

以上是关于使用 yarn berry 时将 .yarn 目录提交到 git的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 yarn 2 (berry) 设置工作区存储库

使用 Yarn 2 (Berry) 在 Docker 镜像中打包应用程序

在 Yarn 2 (berry) 中审计依赖项的最佳方法是啥?

为啥 Mocha 不与 Yarn Berry 合作?

yarn berry run 如何运行已安装的包

我如何直接将“node_modules”与“yarn berry”一起使用