Yarn workspace + lerna 在每个子包中创建 node_modules

Posted

技术标签:

【中文标题】Yarn workspace + lerna 在每个子包中创建 node_modules【英文标题】:Yarn workspace + lerna is creating node_modules in each sub-package 【发布时间】:2020-08-16 11:56:10 【问题描述】:

我有一个 monorepo,我正在使用 yarn workspaces + lerna 进行管理。据我了解,运行yarn 应该在项目的根目录下创建一个node_modules 目录,但不是 在每个单独的包中。我正在关注作者所说的教程:

yarn 工作空间只创建一个 node_modules 文件夹。所有依赖项都被提升到根文件夹

这个假设总是正确的吗?或者是否存在 yarn + lerna 会在每个包中创建单独的 node_modules 目录的情况?

【问题讨论】:

【参考方案1】:

我读了几篇文章,对同样的事情感到困惑。

简短的回答是,你是对的。 Yarn 为每个包创建 node_modules 以及在你的 repo 根目录中的 node_modules 目录。

换句话说,Yarn 在你所有的包中创建/packages/<package>/node_modules。但是,/packages/<package>/node_modules 目录将通过重用 /node_modules 中的依赖关系进行优化。这基本上就是这些作者想要表达的意思!

总而言之,你将拥有n + 1 node_modules 目录,其中n 是你拥有的包的数量,假设你所有的包都有依赖关系。

让我们考虑一个例子:

yarn workspace package-1 add commander

如果/packages/package-1/node_modules/commander 已经在兼容版本的/node_modules/commander 中,则不会创建它。

现在让我们看另一个案例:

yarn workspace package-1 add chalk

如果 Yarn 不能重用 /node_modules 中的内容,它将在本地安装包,在我们的例子中是 /packages/package-1/node_modules/chalk

您可以在 Yarn 的官方博客中阅读更多相关信息:https://classic.yarnpkg.com/blog/2017/08/02/introducing-workspaces/

【讨论】:

以上是关于Yarn workspace + lerna 在每个子包中创建 node_modules的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

Yarn Workspaces 是仅存在于一个工作空间中的提升模块

前端工程化-Genebox小程序端Monorepo架构改造

前端工程化-Genebox小程序端Monorepo架构改造