标签
note
字数
608 字
阅读时间
3 分钟
什么是 monorepo?
Monorepo 的意思是在版本控制系统的单个代码库里包含了许多项目的代码。这些项目虽然有可能是相关的,但通常在逻辑上是独立的,并由不同的团队维护。
Monorepos 有时被称为 单体代码库(monolithic repositories)
应用场景
许多开源项目已经成功使用了单一代码库。例如:
- Laravel[7]:一个用于 Web 开发的 PHP 框架。
- Symfony[8]:一个用 PHP 编写的 MVC 框架。有趣的是,他们已经为每个 Symfony 工具和库创建了只读存储库,这种方法被称为 分库(split-repo)。
- NixOS[9]:一个用单一代码库发布包的 Linux 发行版
- Babel[10]:一个用户 Web 开发的流行的 JavaScript 编译器,其单一代码库包含了完整的项目及其所有插件
此外,React[11]、Ember[12] 和 Meteor[13] 等前端框架都使用单一代码库
如何使用
用 PNPM Workspaces 替换 Lerna + Yarn
pnpm 为什么适用
Pnpm 适用于 monorepo 的主要原因是它的依赖管理机制。与传统的 Node.js 项目不同,monorepo 通常包含多个子项目,每个子项目可能使用不同版本的依赖项。传统的 Node.js 项目使用 npm 安装所有依赖项,所有项目的依赖项都被安装在一个文件夹中,导致不同项目可能会使用不同版本的同一依赖项,这会导致依赖项冲突的问题。
Pnpm 通过使用硬链接和符号链接来解决这个问题。对于 monorepo 中的每个子项目,pnpm 在项目根目录下创建一个名为 .pnpm 的隐藏文件夹,用于存储项目所需的所有依赖项
当一个依赖项被安装到一个项目中时,pnpm 会将其放在该项目的 .pnpm 文件夹中,并在其他需要该依赖项的项目中创建一个符号链接,以避免重复下载和占用更多的磁盘空间。这种方式有效地避免了依赖项冲突的问题,并使得 monorepo 中的依赖项管理更加简便和高效。
参考
5分钟搞懂Monorepo_git_俞凡_InfoQ写作社区
用 PNPM Workspaces 替换 Lerna + Yarn - 掘金