Monorepository mit PHP: Code-Organisation für skalierbare Projekte
In der modernen PHP-Entwicklung wird die Code-Verwaltung mit dem Wachstum des Projekts kritisch. Der traditionelle Ansatz mit vielen separaten Repositories (Polyrepository) führt oft zu Synchronisationsproblemen, doppelten Abhängigkeiten und Schwierigkeiten beim Refactoring. Die Alternative ist ein Monorepository (Monorepo), bei dem der gesamte Code, einschließlich Bibliotheken, Utilities und Anwendungen, in einem einzigen Git-Repository gespeichert wird. In diesem Artikel werden wir untersuchen, wie man ein Monorepository in PHP mit Composer, Git und modernen Tools organisiert.
Was ist ein Monorepository und warum wird es in PHP benötigt?
Ein Monorepository ist ein einziges Repository, das mehrere Projekte, Pakete oder Module enthält, die logisch miteinander verbunden sein können. Für einen PHP-Entwickler bedeutet dies, dass sich der Framework-Kern, der API-Dienst, das Admin-Panel und gemeinsame Bibliotheken in einem Ordner befinden.
Vorteile eines Monorepositorys:
- Einheitliche Versionierung: Alle Änderungen werden atomar committet – eine Korrektur in einer Bibliothek wird sofort von einer Aktualisierung des Codes begleitet, der sie verwendet.
- Vereinfachtes Refactoring: Sie können die Schnittstelle eines Pakets ändern und sofort alle Abhängigkeiten im Rahmen eines einzigen Pull Requests aktualisieren.
- Standardisierung der Tools: Eine einzige
composer.json-Datei für das Root-Verzeichnis, einheitliche Linting- und Testregeln. - Reduzierung von Duplikaten: Gemeinsamer Code (z. B. DTOs, Helfer) muss nicht auf Packagist veröffentlicht werden – er ist direkt verfügbar.
Allerdings erfordert ein Monorepository Disziplin: Ohne eine klare Struktur wird es zu einer „Müllhalde“. Der Schlüssel zum Erfolg ist die richtige Organisation mit Composer Autoload und Git-Submodulen oder spezialisierten Tools wie monorepo-builder.
Struktur eines Monorepositorys in PHP
Betrachten wir eine typische Struktur für ein PHP-Projekt mit mehreren Bibliotheken und einer Anwendung. Das Root-Verzeichnis sieht so aus:
my-monorepo/├── packages/│ ├── core/ # Basisbibliothek (Kern)│ │ ├── src/│ │ │ └── CoreClass.php│ │ └── composer.json│ ├── logger/ # Logging│ │ ├── src/│ │ └── composer.json│ └── api/ # API-Paket (kann eine separate Anwendung sein)│ ├── src/│ │ └── Controllers/│ └── composer.json├── apps/│ └── web/ # Web-Anwendung (Laravel/Symfony)│ ├── public/│ ├── src/│ └── composer.json├── composer.json # Root composer.json (Meta-Paket)├── phpunit.xml.dist└── .gitignoreOrganisationsprinzipien:
- Alle Pakete befinden sich in
packages/. Jedes Paket hat eine eigenecomposer.jsonmit einem eindeutigen Namen (z. B.mycompany/core). - Anwendungen (Frontend, Admin, API) liegen in
apps/. Sie können Pakete auspackages/als lokale Abhängigkeiten verwenden. - Die root
composer.jsondient der globalen Konfiguration (Autoload, Skripte).
Composer für die Arbeit mit einem Monorepository einrichten
Damit das PHP-Autoloading ohne Veröffentlichung der Pakete auf Packagist funktioniert, verwenden wir Path-Repositories. Fügen Sie den folgenden Block in die root composer.json ein:
{ "name": "mycompany/monorepo", "require": { "mycompany/core": "*", "mycompany/logger": "*" }, "repositories": [ { "type": "path", "url": "packages/*" } ], "autoload": { "psr-4": { "MyCompany\\\\": "packages/" } }, "scripts": { "test": "phpunit" }}Wenn Sie nun composer install ausführen, wird Comp