当前位置: 首页 > article >正文

pnpm monorepo 联调方案

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

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

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

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

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

调试

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

使用

pnpm link

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

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

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

pnpm link —global

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

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

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

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

unlink

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

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

# 分别在两个库中执行
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

http://www.kler.cn/a/457773.html

相关文章:

  • 【2024年-12月-11日-开源社区openEuler实践记录】深度探秘 libkperf:解锁系统性能剖析的开源宝藏
  • 【期末复习】一、操作系统概论
  • 用uniapp写一个播放视频首页页面代码
  • Java高频面试之SE-08
  • C++面向对象编程:纯虚函数、抽象类、虚析构、纯虚析构
  • 【AI】最近有款毛茸茸AI生成图片圈粉了,博主也尝试使用风格转换生成可爱的小兔子,一起来探索下是如何实现的
  • Presence:Colyseus用于管理实时分布式数据的工具
  • docker-compose搭建sfpt服务器
  • Go语言高并发实战案例分析
  • 【LeetCode】547、省份数量
  • springboot496基于java手机销售网站设计和实现(论文+源码)_kaic
  • 基于 Python 大数据的电脑硬件推荐系统研究
  • ChatGPT是如何生成长文的
  • 微服务篇-深入了解 XA 模式与 AT 模式、分布式事务(部署 TC 服务、微服务集成 Seata )
  • ACDC中AC前级EMS【EMC】
  • 自学记录HarmonyOS Next DRM API 13:构建安全的数字内容保护系统
  • RealityCapture导入视频序列失败
  • 【视觉SLAM:二、三维空间刚体运动】
  • Java 堆排序原理 图文详解 代码逻辑
  • 『VUE』vue-quill-editor设置内容不可编辑(详细图文注释)
  • 一份关于 Ubuntu 系统下代理配置的故障排查笔记
  • C# OpenCvSharp DNN 卡证检测矫正
  • brupsuite的基础用法常用模块(1)
  • .net core 的数据类型
  • 【探花交友】用户登录总结
  • 输入输出(I/O):熟悉 Java 的 I/O 类库,尤其是 NIO 和文件操作