PHP 单体仓库:为可扩展项目组织代码
在现代 PHP 开发中,随着项目增长,代码管理变得至关重要。传统的多仓库方法(多仓库)常常导致同步问题、依赖重复以及重构困难。替代方案是单体仓库(Monorepo),即所有代码(包括库、工具和应用程序)都存储在一个 Git 仓库中。在本文中,我们将探讨如何使用 Composer、Git 和现代工具在 PHP 中组织单体仓库。
什么是单体仓库,为什么 PHP 需要它?
单体仓库是一个包含多个逻辑相关项目、包或模块的单一仓库。对于 PHP 开发者来说,这意味着框架核心、API 服务、管理面板和公共库都位于同一个文件夹中。
单体仓库的优势:
- 统一版本控制:所有更改以原子方式提交——库中的修复会立即伴随使用该库的代码更新。
- 简化重构:您可以更改包的接口,并在同一个 pull request 中立即更新所有依赖项。
- 工具标准化:根目录下只有一个
composer.json文件,统一的 linting 和测试规则。 - 减少重复:公共代码(例如 DTO、辅助函数)无需发布到 Packagist——可以直接访问。
然而,单体仓库需要纪律:如果没有清晰的结构,它会变成“垃圾场”。成功的关键在于使用 Composer autoload 和 Git 子模块或 monorepo-builder 等专业工具进行正确组织。
PHP 单体仓库的结构
考虑一个包含多个库和一个应用程序的 PHP 项目的典型结构。根目录如下所示:
my-monorepo/├── packages/│ ├── core/ # 基础库(核心)│ │ ├── src/│ │ │ └── CoreClass.php│ │ └── composer.json│ ├── logger/ # 日志记录│ │ ├── src/│ │ └── composer.json│ └── api/ # API 包(可以是独立应用)│ ├── src/│ │ └── Controllers/│ └── composer.json├── apps/│ └── web/ # Web 应用(Laravel/Symfony)│ ├── public/│ ├── src/│ └── composer.json├── composer.json # 根 composer.json(元包)├── phpunit.xml.dist└── .gitignore组织原则:
- 所有包都位于
packages/中。每个包都有自己的composer.json,带有唯一名称(例如mycompany/core)。 - 应用程序(前端、管理面板、API)位于
apps/中。它们可以将packages/中的包用作本地依赖项。 - 根
composer.json用于全局配置(autoload、脚本)。
配置 Composer 以使用单体仓库
为了使 PHP 自动加载无需将包发布到 Packagist 即可工作,我们使用 path 仓库。将以下块添加到根 composer.json:
{ "name": "mycompany/monorepo", "require": { "mycompany/core": "*", "mycompany/logger": "*" }, "repositories": [ { "type": "path", "url": "packages/*" } ], "autoload": { "psr-4": { "MyCompany\\\\": "packages/" } }, "scripts": { "test": "phpunit" }}现在,当执行 composer install 时,Composer