使用PHP的单一仓库:代码组织实践

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

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

开始课程

介绍:什么是单体仓库以及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└── .gitignore


packages/中的每个包都是一个独立的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/"        }    }}

博客

书籍推荐