在 monorepo 项目中,我们通常会使用 pnpm workspace 来统一管理多个子包。例如,一个典型的项目结构如下:
my-monorepo/
├── pnpm-workspace.yaml
├── packages/
│ ├── foo/
│ │ ├── package.json
│ │ └── index.js
│ └── bar/
│ ├── package.json
│ └── index.js
假设我们要给 foo 这个子包添加 antd 依赖,该如何操作呢?下面将根据依赖的作用范围给出两种方案。
1️⃣ 只给 foo 包安装依赖(推荐)
如果 antd 只会被 foo 使用,最合理的做法是让依赖只属于 foo。
操作方式
方法一:在根目录执行 filter 安装
pnpm add antd --filter ./packages/foo
方法二:进入 foo 目录安装
cd packages/foo
pnpm add antd
效果
antd会被记录在foo/package.json的dependencies中。- pnpm workspace 会在 根目录的全局 store 中下载依赖,并在
foo/node_modules创建 软连接(symlink) 。 - 其他子包(如
bar)不会受影响。
这种方式最符合 单包依赖原则,且便于未来维护和升级。
2️⃣ 在整个 workspace 根安装(全局依赖)
如果 antd 是多个子包都会使用的依赖,也可以安装在 monorepo 根目录,让所有子包共享。
操作方式
pnpm add -w antd
效果
antd会被加到 根 package.json 的dependencies中。- 所有子包都可以直接使用
antd,但子包自己的package.json中不会声明它。 - 适合 多个包共享同一依赖 的场景,但依赖关系在子包级别不够清晰。
✅ 总结
| 目标 | 推荐命令 | 说明 |
|---|---|---|
| 仅 foo 使用 | pnpm add antd --filter ./packages/foo 或 cd packages/foo && pnpm add antd | 依赖只属于 foo,其他子包不受影响 |
| 多个包共享 | pnpm add -w antd | 依赖在根目录统一管理,所有子包可用 |
💡 小提示
- pnpm workspace 会自动处理 软连接 和 全局 store,无需担心重复安装或路径问题。
- 使用
--filter比 cd 进入子包更清晰,尤其在 CI/CD 脚本中非常方便。