Bei komplexeren Softwareprojekten kann die Wahl zwischen Monorepo und Polyrepo einen erheblichen Einfluss auf die Produktivität des Teams und die Skalierbarkeit des Codes haben. In diesem Artikel analysieren wir die Unterschiede, Vor- und Nachteile beider Ansätze und helfen dir, die richtige Entscheidung zu treffen.
Was sind Monorepo und Polyrepo?
Monorepo
Ein Monorepo (monolithisches Repository) ist ein einziges Repository, das den Quellcode mehrerer Projekte, Dienste oder Pakete enthält, die oft miteinander verbunden sind.
my-monorepo/ packages/ frontend/ backend/ shared/ package.json turbo.json
Polyrepo
Ein Polyrepo (mehrere Repositories) bedeutet, dass jedes Projekt, jeder Dienst oder jedes Paket sein eigenes separates Repository hat.
repos/ frontend/ package.json backend/ package.json shared/ package.json
Visueller Unterschied
Vor- und Nachteile
Monorepo
Vorteile:
- Erleichtert die gemeinsame Nutzung von Code (z.B. gemeinsame Bibliotheken).
- Atomare Refactorings über mehrere Projekte hinweg.
- Zentrale Verwaltung von Abhängigkeiten und Konfigurationen.
Nachteile:
- Kann mit wachsendem Codeumfang schwerfällig werden.
- Benötigt Tools zur Verwaltung von Teil-Builds/Tests (z.B. Nx, Turborepo).
Polyrepo
Vorteile:
- Jedes Team/Projekt ist unabhängig.
- Für kleine Projekte leichter zu verwalten.
- Ermöglicht granulare Zugriffspolicen.
Nachteile:
- Gemeinsame Nutzung von Code ist schwieriger, ohne Pakete zu veröffentlichen.
- Refactorings über mehrere Repos hinweg sind komplexer.
- Mögliche Duplizierung von Konfigurationen.
Praxisbeispiel: Monorepo mit Turborepo
Angenommen, du möchtest ein Monorepo mit Frontend und Backend mithilfe von Turborepo erstellen.
1. Monorepo initialisieren
npx create-turbo@latest
2. Typische Struktur
my-monorepo/ apps/ web/ # Frontend Next.js api/ # Backend Node.js/Express packages/ ui/ # Gemeinsame Komponentenbibliothek utils/ # Gemeinsame Funktionen turbo.json package.json
3. Beispiel-Workspace in package.json
{ "private": true, "workspaces": [ "apps/*", "packages/*" ] }
4. Beispiel für den Import einer gemeinsamen Bibliothek
Angenommen, du hast eine Funktion in packages/utils/src/formatDate.ts
:
// packages/utils/src/formatDate.ts export function formatDate(date: Date): string { return date.toLocaleDateString('de-DE'); }
Im Frontend:
// apps/web/pages/index.tsx import { formatDate } from '@myorg/utils'; export default function Home() { return <div>Heute ist {formatDate(new Date())}</div>; }
Wann sollte man Monorepo wählen?
- Mittelgroße bis große Teams, die an mehreren zusammenhängenden Projekten arbeiten.
- Notwendigkeit, Code zu teilen und großflächige Refactorings durchzuführen.
- Projekte, die schnell wachsen und optimierte Builds/Tests benötigen.
Wann sollte man Polyrepo wählen?
- Kleine oder unabhängige Projekte.
- Getrennte Teams, die an unterschiedlichen Produkten arbeiten.
- Sehr restriktive Zugriffspolicen.
Fazit
Es gibt keine perfekte Lösung für alle. Die Wahl hängt von der Teamgröße, der Komplexität der Projekte und den Anforderungen an die Zusammenarbeit ab. Wichtig ist, sich der jeweiligen Kompromisse bewusst zu sein und die richtigen Werkzeuge zur Bewältigung der Komplexität zu wählen.