pnpm Workspace 中给单个子包添加依赖

81 阅读2分钟

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.jsondependencies 中。
  • pnpm workspace 会在 根目录的全局 store 中下载依赖,并在 foo/node_modules 创建 软连接(symlink)
  • 其他子包(如 bar)不会受影响。

这种方式最符合 单包依赖原则,且便于未来维护和升级。


2️⃣ 在整个 workspace 根安装(全局依赖)

如果 antd 是多个子包都会使用的依赖,也可以安装在 monorepo 根目录,让所有子包共享。

操作方式

pnpm add -w antd

效果

  • antd 会被加到 根 package.jsondependencies 中。
  • 所有子包都可以直接使用 antd,但子包自己的 package.json 中不会声明它。
  • 适合 多个包共享同一依赖 的场景,但依赖关系在子包级别不够清晰。

✅ 总结

目标推荐命令说明
仅 foo 使用pnpm add antd --filter ./packages/foocd packages/foo && pnpm add antd依赖只属于 foo,其他子包不受影响
多个包共享pnpm add -w antd依赖在根目录统一管理,所有子包可用

💡 小提示

  • pnpm workspace 会自动处理 软连接全局 store,无需担心重复安装或路径问题。
  • 使用 --filter 比 cd 进入子包更清晰,尤其在 CI/CD 脚本中非常方便。