前言
在之前的文章《pnpm monorepo 联调方案》中,我详细介绍了如何使用 pnpm link
和 pnpm link --global
来解决 monorepo 环境下的调试难题。
时间过去了一段时间,pnpm 也在不断演进。最近在使用过程中,我发现了一个有趣的变化:执行 pnpm link
时不再需要添加 --global
参数,同时 pnpm 会自动创建 pnpm-workspace.yaml
文件。这引起了我的好奇心,决定深入研究一下 pnpm 10.x 版本中 link
功能的最新变化。
pnpm 10.x 中关于 link 的变更
最大的变化就是 去除了 --global
参数。
之前我们这样操作:
bash
# 库中
pnpm link --global
# 项目中
pnpm link --global <pkg>
现在直接:
bash
# 库中
pnpm link
# 项目中
pnpm link <pkg>
看起来是小改动,但其实是把之前的 pnpm link --global
的行为直接变成了 pnpm link
的默认行为。
从官方文档也能看出来,现在的 pnpm link
描述和之前 9.x 版本的 pnpm link --global
完全一样。


取消链接还是用 pnpm unlink
:
bash
pnpm unlink <pkg>
实际使用体验
在库中执行 link
现在在基础库中执行 pnpm link
,会直接链接到全局:
bash
cd ~/packages/core
pnpm install
pnpm link
# 输出示例
❯ pnpm link
WARN The package @easy-editor/core, which you have just pnpm linked, has the following peerDependencies specified in its package.json:
- mobx@^6.13.5
The linked in dependency will not resolve the peer dependencies from the target node_modules.
This might cause issues in your project. To resolve this, you may use the "file:" protocol to reference the local dependency.
√ The modules directory at "C:\\Users\\user\\AppData\\Local\\pnpm\\global\\5\\node_modules" will be removed and reinstalled from scratch. Proceed? (Y/n) · true
Recreating C:\\Users\\user\\AppData\\Local\\pnpm\\global\\5\\node_modules
在项目中链接库
在项目中链接也更直接了:
bash
cd ~/projects/my-project
pnpm link @easy-editor/core
# 输出示例
❯ pnpm link @easy-editor/core
WARN The package @easy-editor/core, which you have just pnpm linked, has the following peerDependencies specified in its package.json:
- mobx@^6.13.5
The linked in dependency will not resolve the peer dependencies from the target node_modules.
This might cause issues in your project. To resolve this, you may use the "file:" protocol to reference the local dependency.
√ The modules directory at "D:\\Programming\\EasyEditor\\EasyDashboard\\node_modules" will be removed and reinstalled from scratch. Proceed? (Y/n) · true
Recreating D:\\Programming\\EasyEditor\\EasyDashboard\\node_modules
dependencies:
+ @easy-editor/core 0.0.0 <- C:\\Users\\user\\AppData\\Local\\pnpm\\global\\5\\node_modules\\@easy-editor\\core
自动生成的 workspace 配置
这是个新发现,链接完成后,pnpm 会自动在项目根目录生成 pnpm-workspace.yaml
:
yaml
overrides:
'@easy-editor/core': link:C:/Users/user/AppData/Local/pnpm/global/5/node_modules/@easy-editor/core
这样就能清楚地看到当前项目链接了哪些包,比之前透明多了。
多库联调的改进
之前需要给每个库都加 --global
,现在直接:
bash
# 在各个库中
cd ~/packages/core && pnpm link
cd ~/packages/designer && pnpm link
cd ~/packages/utils && pnpm link
# 在项目中
cd ~/projects/my-project
pnpm link @myorg/core
pnpm link @myorg/designer
pnpm link @myorg/utils
对于 workspace:*
这种依赖,pnpm 还是会自动处理,和之前一样智能。
前后对比
pnpm 9.x | pnpm 10.x | |
---|---|---|
全局链接 | pnpm link --global |
pnpm link |
项目链接 | pnpm link --global <pkg> |
pnpm link <pkg> |
workspace 配置 | 手动管理 | 自动生成 |
操作复杂度 | 需要记住加 --global | 更简单直接 |
总结
pnpm 10.x 的这个改动虽然看起来不大,但确实让联调操作更简单了。不用再记那个 --global
参数,直接 pnpm link
就完事。
加上自动生成的 workspace 配置文件,整个链接状态也更透明了。如果你还在用旧版本,建议升级试试,体验确实有提升。