用途
在 monorepo 中为各包之间添加依赖,把工作区内的包链接起来。所有包管理器都支持 workspaces,但语法不同,本技能负责识别并给出正确的命令。
识别包管理器
先检查根级 package.json 中是否存在 packageManager 字段。
也可以检查仓库根目录的锁文件:
- pnpm-lock.yaml → pnpm
- yarn.lock → yarn
- bun.lock / bun.lockb → bun
- package-lock.json → npm
工作流程
- 确定消费者包(发起导入的一方)
- 确定提供者包(被导入的一方)
- 使用对应包管理器的工作区语法添加依赖
- 验证消费者包的 node_modules/ 中是否创建了软链接
各包管理器用法
pnpm
使用 workspace: 协议——只有显式声明时才会创建软链接。
# 在消费者目录中
pnpm add @org/ui --workspace
# 或在任意位置使用 --filter
pnpm add @org/ui --filter @org/app --workspace
package.json 中的结果:
{ "dependencies": { "@org/ui": "workspace:*" } }
yarn(v2+/berry)
同样使用 workspace: 协议。
yarn workspace @org/app add @org/ui
package.json 中的结果:
{ "dependencies": { "@org/ui": "workspace:^" } }
npm
没有 workspace: 协议。npm 会自动软链接工作区包。
npm install @org/ui --workspace @org/app
package.json 中的结果:
{ "dependencies": { "@org/ui": "*" } }
npm 在安装期间会自动解析到本地工作区。
bun
支持 workspace: 协议(与 pnpm 兼容)。
cd packages/app && bun add @org/ui
package.json 中的结果:
{ "dependencies": { "@org/ui": "workspace:*" } }
示例
示例 1:pnpm——把 ui 库链接到 app
pnpm add @org/ui --filter @org/app --workspace
示例 2:npm——链接多个包
npm install @org/data-access @org/ui --workspace @org/dashboard
示例 3:排查“Cannot find module”
- 检查依赖是否已在消费者包的 package.json 中声明
- 如果没有,用上面的对应命令添加
- 运行安装(pnpm install、npm install 等)
说明
- 软链接出现在
<consumer>/node_modules/@org/<package> - 提升(hoisting)行为因包管理器而异:
- npm/bun:把共享依赖提升到根 node_modules
- pnpm:不做提升(严格隔离,防止幽灵依赖)
- yarn berry:默认使用 Plug'n'Play(没有 node_modules)
- 根 package.json 应设置
"private": true,以防意外发布
适用场景
- 刚创建或生成新包,需要接好它们的依赖
- 在 monorepo 中为包之间建立导入关系
- 排查因依赖未声明导致的“Cannot find module”问题
限制
本技能仅覆盖 npm、yarn、pnpm、bun 四种包管理器的工作区链接方式;其他包管理器或非工作区场景暂未提供。