Skip to content

Monorepo

monorepo 是一种流行的,将多个包放在一个 git 仓库中进行管理的方案。

解决方案

一、Lerna 5 + Yarn + NX

特点:

  • 将依赖目录提升到项目根目录下

这会导致幽灵依赖问题

幽灵依赖指的是某个子包没有在 package.json 文件中指明某个依赖,却可以使用这个依赖。

这和 node_modules 的查找机制有关系。子目录找不到 node_modules 就像上级进行查找。

  • nx 可以不用先 cd 到对应目录去 run script
  • nx 可以查看项目间的依赖关系
  • nx 可以利用缓存
shell
# 运行 sco-design 包下的 build script
nx build sco-design

依赖安装

<package-name> 指 npm 包名称

workspace 可以理解为子包

(一)、安装依赖到项目根目录

yarn add <package-name> -W

(二)、为 workspace 添加 remote package

yarn workspace <workspace-name> add <package-name>

(三)、为 workspace 添加 local package

yarn workspace <workspace-name> add <package-name>@version

添加本地依赖需要指明版本号。需要注意的是,我们在使用本地依赖时,实际上引用的应该是 npm publish 后的内容。

(四)、移除依赖

  1. 从根目录移除依赖 yarn remove <package-name> -W
  2. 移除 workspace 目录 yarn workspace <workspace-name> remove <package-name>

二、PNPM + Rush

特点:

  • PNPM 包管理器解决了幽灵依赖问题
  • Rush 文档更加齐全和友好
  • Rush 提供了 rushx 命令去 run script,前提是 cd 到对应的目录中去
  • Rush 支持自定义命令,如 rush prettier
  • Rush 不和 npm install or yarn add 一起使用
  • 每次 package.json 文件内容变动需要运行 rush update 命令
  • Rush 支持生成部署目录
  • Rush rush rebuildnx run-many 分析依赖关系更加智能