type
status
date
slug
summary
tags
category
icon
password
Edited
Aug 11, 2024 04:11 PM
Created
Aug 11, 2024 04:06 PM
在我最近的工作项目中,我采用了
pnpm monorepo
来管理多个基础库的开发。这种方式虽然在项目组织上提供了便利,但在调试过程中却给我带来了不小的挑战。当项目中的库出现 bug 时,定位问题的源头变得异常困难。我最初的想法是,由于
pnpm monorepo
环境下库之间存在 monorepo 其他库的依赖,传统的调试方法似乎难以应对。特别是处理 workspace:*
这样的依赖声明时,我感到无从下手。起初,我没有深入研究,而是选择了最直接的方法来应对问题:
- 直接在项目中定位可能的错误点,并尝试复现问题场景。
- 在基础库中对发现的 bug 进行修复。
- 修复后发布新版本,并在项目中验证修复效果。
这个过程不仅繁琐耗时,而且往往不能保证问题得到彻底解决。
调试
在 pnpm 的官网上看到了
pnpm link
,了解了一下发现,原来也是可以实现联调的。使用
pnpm link
pnpm link
和 npm link
的使用是一样的,用于链接指定的文件夹。pnpm link —global
而
pnpm link --global
的话,是将库链接到全局的 node_modules
。然后再另一个需要使用的库或者项目中通过
pnpm link --global <pkg>
引用即可。unlink
完成调试后,可以使用
unlink
命令来取消链接,用法和 pnpm link
相同。说明
对于库中存在引用其他库的情况下(
workspace:*
):pnpm link
会发出警告,但 pnpm 会自动处理这些依赖,确保所有链接的库都能正确解析其依赖项。我们可以看一下。
在你
pnpm link --global
的时候,pnpm 会进行警告。而在项目中链接库后,在
node_modules
可以看出来,pnpm 帮我们已经处理好了。pnpm 会对特殊的引用库(
workspace:*
)创造软链,链接到 pnpm monorepo
中的对应库中。所以,本质上说,其实和
link
单个库是一样的,只是 pnpm 帮我们做了些额外的依赖处理。多库联调
当然,你甚至也可以直接同时
link
多个库进行调试。这样可以实现多个依赖的库之间一起进行联调了。以上图为例,现在要联调
core
和 designer
两个库,其中 designer 依赖了 core,两个库先分别 link
。其实很简单,通过这种方式,
core
和 designer
都被链接到了全局的 node_modules
中。原理
现在
core
和 designer
都链接在了全局的 node_modules
中,而项目中其实也是软链到了全局 node_modules
中。我们再回到
desinger
库,它依赖了 core
,pnpm
会帮我们软链到的 core
,而此时项目的 core
是软链到全局的 node_modules
。尽管两者 core 最终都是链接到基础库中,但链接的路径是不一样的。
- 链接库存在特殊的引用库(
workspace:*
)时,pnpm 会帮我们直接软链到其库里。
- 而
link
的方式,是软链到全局node_modules
中,再软链到基础库中。
参考链接
- 作者:JinSo
- 链接:https://jinso365.top/article/6d96671f-9efa-4909-a54f-64ec44b1ac70
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。