如何一键打开多个wordpress,长沙建站优化,重庆平台网站建设工,引流推广平台是什么意思引言
在我之前的开发经历中#xff0c;并没有实际使用过 Monorepo 管理项目#xff0c;尽管之前对此有所了解#xff0c;但并未深入探究。然而#xff0c;如今许多开源项目都采纳了 Monorepo 方式#xff0c;对于不熟悉它的开发者来说#xff0c;阅读和理解这些项目的源…引言
在我之前的开发经历中并没有实际使用过 Monorepo 管理项目尽管之前对此有所了解但并未深入探究。然而如今许多开源项目都采纳了 Monorepo 方式对于不熟悉它的开发者来说阅读和理解这些项目的源码可能会相对困难。所以我近期简单研究了一下使用 PNPM 搭建 Monorepo 项目的方法。
什么是 Monorepo
在软件开发中随着项目的逐渐庞大和复杂化管理多个相关联的代码库就变成了一项挑战。这时Monorepo单体代码仓应运而生它能有效管理多个项目或模块。
Monorepo 是指在一个单一的版本控制系统仓库中管理多个模块/项目的策略。相对于多仓库Multirepo它能带来以下好处
统一的工作流程和工具链整个仓库的项目可以共享构建测试部署等流程。更容易的代码共享和重用不同项目之间共享代码变得直接和高效。依赖管理确保各个模块间依赖的版本一致性。原子性提交和版本控制可以在单个提交中跨多个项目进行更改简化版本跟踪。
解决的问题
Monorepo 管理方式解决了如下问题
跨项目的改动困难更改核心库需要在多个仓库中手动更新。版本不一致不同项目可能因为未及时更新依赖而导致的版本冲突。流程复杂化多个代码仓可能意味着重复配置多个 CI/CD 流程。团队协作问题不同的项目分属不同的仓库增加了团队之间沟通的工作量。
使用 pnpm 搭建 Monorepo
第一步安装 pnpm
在终端执行以下命令安装 pnpm
npm install -g pnpm第二步初始化仓库
创建一个新文件夹作为 Monorepo 的根目录并初始化仓库
mkdir my-monorepo
cd my-monorepo
pnpm init第三步创建工作空间配置文件
在根目录下创建 pnpm-workspace.yaml 文件来配置工作区
packages 是一个路径的数组用来指定包含工作区包的目录。通常子项目会统一放在 root/packages/** 目录下当然这个目录名称也可以随喜好定义一般会命名为 packagespackages 可以指定多个目录
packages:- packages/*第四步添加子项目
在 packages 文件夹下创建子项目并进行初始化
mkdir packages/project-a
cd packages/project-a
pnpm init -y下面是一个有多个包的目录结构的演示 第五步添加依赖
使用 pnpm 的 pnpm add 命令在子项目中添加依赖
cd packages/project-a
pnpm add lodash第六步跨项目依赖
方法1
如果 project-a 依赖于 project-b可以直接执行命令操作
cd packages/project-a
pnpm add project-b方法二
或者直接编辑 project-a 项目的 package.json
{name: project-a,// ...dependencies: {// 添加 project-b , 指定为 workspace:*project-b: workspace:*,project-c: workspace:*}
}添加好后执行 pnpm install 即可。
pnpm install第七步构建和运行
在根目录下使用 pnpm 运行命令比如测试针对所有项目
pnpm recursive run test# -r 是 recursive 的命令缩写
pnpm -r run test例如我在所有 package 下都加了 print 命令然后在根目录执行 pnpm -r run print 常见的 Monorepo 解决方案
除了 pnpm还有其他几种流行的 Monorepo 管理工具
Lerna最受欢迎的 Monorepo 管理工具之一提供了版本管理与发布的功能。Yarn WorkspacesYarn 的多包管理功能利用 Yarn 的快速安全的包管理优势。Rush用于大型 Monorepo 的构建工具提供了高级的包管理和构建缓存功能。
结语
通过上述步骤我们可以看出来使用 pnpm 搭建 monorepo 项目非常简单不需要额外引入其他依赖即可完成 monorepo 仓库的搭建。
相关资料
pnpm workspace: https://pnpm.io/zh/workspacespnpm recursive: https://pnpm.io/zh/cli/recursive