Yarn 和第三方 NPM 客户端的黯淡未来
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
Yarn 无法优雅地处理底层 NPM 基础设施——而且它可能永远也无法做到这一点。
我这几天一直在处理 Yarn 的错误。我们的构建以各种奇怪且随机的方式失败——所有迹象都指向 Yarn。我可以简单概括一下调查结果:Yarn 对上游 NPM 基础设施错误的处理方式并不理想。
但问题不仅仅在于 Yarn 代码存在 bug——更严重的问题是 Yarn(客户端)与 NPM 基础设施之间存在脱节。由此产生的错误足以引发关于迁移到 NPM 客户端的讨论。然而,重新使用 NPM 又会引出一个更大的问题:依赖 NPM 基础设施的第三方包管理器是否还能继续存在下去。
毛线的问题
我最近遇到的问题都与 Yarn 对 NPM 基础设施的封装有关。Yarn 本身并不托管任何软件包,因此对于这些软件包的部署方式、抛出的错误等等,它并没有太多的发言权。
Yarn 客户端已经编写了 NPM CDN 的所有故障场景,但如果 CDN 出现不可预测的故障(例如完整性检查失败、 安装私有包,甚至发布版本过多),Yarn 客户端无法正确处理这些情况。最好的情况是安装步骤失败,最坏的情况是 Yarn 会像什么都没发生过一样干净地退出。
那么我们当时面临的问题是什么?
安装过程中出现误报
首先,Yarn 有时会在安装过程中看似卡住,有时它确实会卡住。但令人担忧的是,有时 Yarn 会在安装步骤中途正常退出。在某些情况下,不执行完整安装可以解决问题,但在其他情况下则不行——这会导致构建出现误报。
| yarn install --frozen-lockfile | |
| yarn install v1.5.1 | |
| [1/4] Resolving packages... | |
| warning Resolution field "strip-ansi@3.0.1" is incompatible with requested version "strip-ansi@^5.1.0" | |
| warning Resolution field "strip-ansi@3.0.1" is incompatible with requested version "strip-ansi@^4.0.0" | |
| warning Resolution field "strip-ansi@3.0.1" is incompatible with requested version "strip-ansi@^4.0.0" | |
| [2/4] Fetching packages... |
这些误报在 Yarn 的发展历程中一直存在。快速搜索一下就能发现,这类问题早在 2016 年就有人提出过。但 Yarn 的维护者们将其归咎于诸如“网络问题”之类的琐碎问题,并认为这些问题会随着 NPM 的可用性而时有时无。但有趣的是,NPM 状态页面上的报告与 Yarn 中出现的问题并不一致。
已下载一半的文件
其次,虽然有时错误会导致 Yarn 客户端像上面那样退出,但有时 NPM 基础架构会以不同的方式失败,例如提前关闭连接。这会导致以下类型的错误,即“文件意外结束”。
令人恼火的是,这两个错误都不会将你的注意力引向 NPM CDN,而是让你陷入一个无底洞,以为问题出在你这边。
纱线的困境
你现在可能在想:“好吧,Yarn 确实有一些问题,但所有开源软件也都有问题——为什么不贡献一份力量,一劳永逸呢?”
但问题远不止于此。我更担心的是 Yarn 和 NPM 之间固有的关系。让我解释一下……
Yarn 伴着 NPM 的旋律翩翩起舞
我们需要记住,Yarn 只是封装在 NPM 基础设施上的一个客户端。由于 NPM 承载着所有的软件包基础设施,因此 Yarn 现在(并且会持续)容易受到 NPM 上游任何问题的影响。这意味着,在采用基于 CDN 变更的任何必要客户端变更时,Yarn 将始终落后于 NPM。
纱线被忽视了
除了 Yarn 生态系统面临的这些困难之外,像Github 这样的重要参与者选择优先考虑 NPM 客户端而不是 Yarn 客户端,这无疑也加剧了 Yarn 生态系统的困境。
Yarn 1.0 即将弃用
最后,除了 CDN 问题之外,Yarn 1.0 的大部分内容都被搁置,以便贡献者能够专注于 2.0 版本。但是, Yarn 2.0 中的任何功能都无法解决 NPM 和 Yarn 客户端之间的脱节问题。例如,您可以查看当前 Yarn 项目的贡献图。
并与 Yarn 2.0 代码库进行比较。
你明白我的意思吗?注意力转移只会加剧问题。Yarn 客户端的修复工作无法像 NPM 那样迅速便捷地完成。而这些修复或许有助于减轻 NPM 错误带来的困扰。
解决方案
虽然这些问题不在你我掌控之中,但你可以做一些事情来解决或减轻你可能感受到的痛苦。
解决方法 1:使用最新版本的 Node 和 NPM
首先要检查的是你运行的是最新版本。运行最新版本可以确保你使用 Yarn 内置的所有其他错误处理机制。
解决方法二:验证您的安装
由于有时安装会在中途失败,您应该手动确保安装中包含所需的软件包。Yarn 内置了一个实用程序来执行此操作,该程序会将当前安装的软件包package.json与预期安装的软件包进行比较node_modules。要运行此命令,请运行:yarn check --verify-tree
解决方法 3:硬安装
另一个技巧是确保进行完整安装,方法是向--hardYarn 传递标志以强制执行完整更新。
方案四:切换到 NPM 和 NPM CI
最后,如果其他所有方法都失败了,您可以切换到 NPM。切换到 NPM 并不能解决 CDN 的不稳定问题,但可能会改善极端情况下的错误处理。
克服纱线限制
以上就是全部内容。我想和大家分享一下我们在使用 Yarn 时遇到的一些困难、原因以及可能的解决方案。不过,令人遗憾的是,这也引发了一些关于与 NPM 基础设施兼容的第三方客户端未来发展方向的有趣问题。
如果不改变生态系统的运作方式,第三方客户端似乎注定只能获得二流体验。或许他们可以通过更好的功能来扭转局面?我们无法预测未来,但希望现在至少你能修复你的构建系统!
Lou 是《云原生软件工程通讯》的编辑,该通讯致力于让云软件工程更容易理解和接受,每两周您都会在收件箱中收到一份精选的云原生软件工程师最佳内容摘要。
文章来源:https://dev.to/loujaybee/yarn-and-the-dark-future-of-third-party-npm-clients-2ie3





