使用PHP的单一代码库:大型项目的代码组织

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

博客

书籍推荐