Yarn & Monorepo:防止使用本地包

Posted

技术标签:

【中文标题】Yarn & Monorepo:防止使用本地包【英文标题】:Yarn & Monorepo: Prevent using local packages 【发布时间】:2021-10-09 17:38:03 【问题描述】:

我有一个 yarn/lerna monorepo,其中包含多个相互依赖的包。如果我将packageA 添加为packageB 的依赖项并执行yarn install,我发现node_modules/packageA 实际上是packages/packageA 的符号链接,而不是该包的已发布版本。

如果packageBpackageA 之前构建,这会在CI 上产生问题- 构建失败,因为node_modules/packageA 只是指向裸源,没有构建产品(因为packageA 尚未构建)。

如何强制 yarn 始终下载 packageA 的已发布版本?


yarn --version: 1.22.10

旁注:如果我想使用packageA 的本地版本,我会使用yarn link 或本地路径而不是package.json 中的版本。为什么纱线默认为这种行为?

【问题讨论】:

【参考方案1】:

一个选项是:“重点工作区”-see the guide here。

在我的例子中,我添加了一个文件 packages/packageB/.yarnrc,它指定始终为 yarn install 使用 --focus 参数:

--install.focus true

这将确保packageB 在其自己的node_modules 文件夹中拥有已发布的packageA 的副本。

但是:这一次只适用于一个包。

【讨论】:

【参考方案2】:

您可以按依赖顺序构建包。所以在你的情况下,在你的 CI 中它会是这样的(假设在包的 package.json 中有一个名为“build”的脚本条目):

yarn workspace packageA run build
yarn workspace packageB run build

这样您可以控制构建的顺序,它们会成功完成,并且您不必强制使用已发布的包。

【讨论】:

实际上,lerna 已经按照依赖顺序自动构建包。这消除了像这样手动指定构建顺序的需要。

以上是关于Yarn & Monorepo:防止使用本地包的主要内容,如果未能解决你的问题,请参考以下文章

monorepo Yarn 工作区 - 共享 esLint 和 Prettier 配置

lerna+yarn workspace+monorepo项目的最佳实践

javascript 使用lerna,monorepo和yarn工作空间创建一个babel变换器来修复babel-jest问题

基于 Yarn WorkSpace + Lerna + OrangeCI 搭建 Typescript Monorepo 项目实践

在 Netlify Monorepo (Yarn Workspace/Lerna) 上使用 UI 库作为 Web 应用程序的依赖项

Yarn + Lerna + Angular Libs = 出版失败?