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
的符号链接,而不是该包的已发布版本。
如果packageB
在packageA
之前构建,这会在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 应用程序的依赖项