Appearance
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 后的内容。
(四)、移除依赖
- 从根目录移除依赖
yarn remove <package-name> -W
- 移除 workspace 目录
yarn workspace <workspace-name> remove <package-name>
二、PNPM + Rush
特点:
- PNPM 包管理器解决了幽灵依赖问题
- Rush 文档更加齐全和友好
- Rush 提供了
rushx
命令去 run script,前提是cd
到对应的目录中去 - Rush 支持自定义命令,如
rush prettier
- Rush 不和
npm install
oryarn add
一起使用 - 每次
package.json
文件内容变动需要运行rush update
命令 - Rush 支持生成部署目录
- Rush
rush rebuild
比nx run-many
分析依赖关系更加智能