pnpm monorepo 联调方案

在我最近的工作项目中,我采用了 pnpm monorepo 来管理多个基础库的开发。这种方式虽然在项目组织上提供了便利,但在调试过程中却给我带来了不小的挑战。

当项目中的库出现 bug 时,定位问题的源头变得异常困难。我最初的想法是,由于 pnpm monorepo 环境下库之间存在 monorepo 其他库的依赖,传统的调试方法似乎难以应对。特别是处理 workspace:* 这样的依赖声明时,我感到无从下手。

起初,我没有深入研究,而是选择了最直接的方法来应对问题:

  1. 直接在项目中定位可能的错误点,并尝试复现问题场景。
  2. 在基础库中对发现的 bug 进行修复。
  3. 修复后发布新版本,并在项目中验证修复效果。

这个过程不仅繁琐耗时,而且往往不能保证问题得到彻底解决。

调试

在 pnpm 的官网上看到了 pnpm link,了解了一下发现,原来也是可以实现联调的。

使用

pnpm linknpm link 的使用是一样的,用于链接指定的文件夹。

Shell 复制代码
# 找到需要联调的库,安装依赖
cd ~/packages/core
pnpm install

# 来到项目中,链接这个库即可
cd ~/projects/my-project
pnpm link ~/packages/core

pnpm link --global 的话,是将库链接到全局的 node_modules

然后再另一个需要使用的库或者项目中通过 pnpm link --global <pkg> 引用即可。

Shell 复制代码
# 找到需要联调的库,安装依赖,然后进行 link
cd ~/packages/core
pnpm install
pnpm link --global

# 来到项目中,链接这个库即可
cd ~/projects/my-project
pnpm link --global core

完成调试后,可以使用 unlink 命令来取消链接,用法和 pnpm link 相同。

Shell 复制代码
pnpm unlink <dir>
pnpm unlink --global
pnpm unlink --global <pkg>

说明

对于库中存在引用其他库的情况下(workspace:* ):

pnpm link 会发出警告,但 pnpm 会自动处理这些依赖,确保所有链接的库都能正确解析其依赖项。

我们可以看一下。

在你 pnpm link --global 的时候,pnpm 会进行警告。

而在项目中链接库后,在 node_modules 可以看出来,pnpm 帮我们已经处理好了。

pnpm 会对特殊的引用库(workspace:* )创造软链,链接到 pnpm monorepo 中的对应库中。

所以,本质上说,其实和 link 单个库是一样的,只是 pnpm 帮我们做了些额外的依赖处理。

多库联调

当然,你甚至也可以直接同时 link 多个库进行调试。这样可以实现多个依赖的库之间一起进行联调了。

以上图为例,现在要联调 coredesigner 两个库,其中 designer 依赖了 core,两个库先分别 link

Shell 复制代码
# 分别在两个库中执行
pnpm i
pnpm link --global

# 在项目中执行
pnpm link --global core
pnpm link --global designer

其实很简单,通过这种方式,coredesigner 都被链接到了全局的 node_modules 中。

原理

现在 coredesigner 都链接在了全局的 node_modules 中,而项目中其实也是软链到了全局 node_modules 中。

我们再回到 desinger 库,它依赖了 corepnpm 会帮我们软链到的 core ,而此时项目的 core 是软链到全局的 node_modules

尽管两者 core 最终都是链接到基础库中,但链接的路径是不一样的。

  • 链接库存在特殊的引用库(workspace:* )时,pnpm 会帮我们直接软链到其库里。
  • link 的方式,是软链到全局 node_modules 中,再软链到基础库中。

参考链接

  1. pnpm link | pnpm
相关推荐
清幽竹客10 分钟前
vue-37(模拟依赖项进行隔离测试)
前端·vue.js
vvilkim10 分钟前
Nuxt.js 页面与布局系统深度解析:构建高效 Vue 应用的关键
前端·javascript·vue.js
滿14 分钟前
Vue3 父子组件表单滚动到校验错误的位置实现方法
前端·javascript·vue.js
夏梦春蝉1 小时前
ES6从入门到精通:模块化
前端·ecmascript·es6
拓端研究室2 小时前
视频讲解:门槛效应模型Threshold Effect分析数字金融指数与消费结构数据
前端·算法
工一木子3 小时前
URL时间戳参数深度解析:缓存破坏与前端优化的前世今生
前端·缓存
半点寒12W5 小时前
微信小程序实现路由拦截的方法
前端
某公司摸鱼前端6 小时前
uniapp socket 封装 (可拿去直接用)
前端·javascript·websocket·uni-app
要加油哦~6 小时前
vue | 插件 | 移动文件的插件 —— move-file-cli 插件 的安装与使用
前端·javascript·vue.js
小林学习编程6 小时前
Springboot + vue + uni-app小程序web端全套家具商场
前端·vue.js·spring boot