介绍:什么是单体仓库以及PHP开发者为何需要它?
大型PHP项目的开发常常面临代码组织问题。传统的为每个组件(库、微服务、前端)单独创建仓库的方法会导致碎片化、依赖重复以及重构困难。替代方案是单体仓库——一个包含所有相关项目和包的统一仓库。
在本文中,我们将通过实践讲解如何为PHP项目组织单体仓库。您将学习如何配置Composer、构建文件夹结构、管理依赖以及组织CI/CD。本文面向具备Git和Composer基础的中级PHP开发者。
单体仓库的主要优势:
- 统一的变更历史和原子提交
- 简化公共依赖的重构
- 统一的工具和配置
- 通过单一流水线简化CI/CD
单体仓库结构:选择正确的架构
成功单体仓库的关键要素是精心设计的文件夹结构。对于PHP项目,我们推荐以下基于包和应用程序分离的模板:
monorepo/├── apps/ # 成品应用程序(网站、API、控制台脚本)│ ├── api/ # 基于Slim或Laravel的REST API│ │ ├── public/│ │ ├── src/│ │ └── composer.json│ └── admin/ # 管理面板│ ├── public/│ ├── src/│ └── composer.json├── packages/ # 可复用的PHP包(库)│ ├── core/ # 系统核心:基础类、异常│ │ ├── src/│ │ └── composer.json│ ├── users/ # 用户管理包│ │ ├── src/│ │ └── composer.json│ └── payments/ # 支付包│ ├── src/│ └── composer.json├── tools/ # 构建和辅助脚本├── tests/ # 整个项目的集成和端到端测试├── composer.json # 根清单(通常为"type": "project")├── composer.lock├── phpstan.neon├── phpunit.xml.dist└── .gitignorepackages/中的每个包都是一个独立的Composer库,拥有自己的composer.json。apps/中的应用程序将这些包作为本地依赖引入。这种结构允许:
- 隔离逻辑并独立测试包
- 使用严格类型和PSR-4自动加载
- 无需复制即可在不同应用程序间复用代码
配置Composer以支持单体仓库
Composer是PHP中管理依赖的主要工具。为了支持单体仓库,我们使用两个关键机制:本地路径(path)和根清单。
步骤1:根composer.json
在项目根目录创建最小清单,定义这是一个单体仓库:
{ "name": "mycompany/monorepo", "type": "project", "require": { "php": "^8.1" }, "autoload": { "psr-4": { "MyCompany\\\\": "packages/" } }, "scripts": { "test": "phpunit", "phpstan": "phpstan analyse" }}步骤2:包中的本地依赖
packages/users/中的每个包必须有自己的composer.json。例如:
{ "name": "mycompany/users", "type": "library", "require": { "php": "^8.1", "mycompany/core": "*" }, "autoload": { "psr-4": { "MyCompany\\\\Users\\\\": "src/" } }}