Monorepository mit Swift: Code-Organisation für Einsteiger
Wenn Sie mit der Entwicklung von Apps in Swift für iOS oder macOS beginnen, stellt sich früher oder später die Frage: Wie organisiert man den Code, damit er nicht im Chaos versinkt? Besonders wenn Sie mehrere Projekte haben (z. B. eine iOS-App, eine watchOS-Erweiterung und einen Server-Teil mit Vapor). Ein moderner Ansatz ist das Monorepository (Monorepo). In diesem Artikel schauen wir uns an, was ein Monorepository ist, warum es in der Swift-Entwicklung nützlich ist und wie man es in der Praxis organisiert.
Was ist ein Monorepository und warum wird es benötigt?
Ein Monorepository (Monorepo) ist ein Ansatz zur Code-Verwaltung, bei dem alle Projekte, Bibliotheken und Module in einem einzigen Repository (z. B. in Git) gespeichert werden. Im Gegensatz zu Multirepositories, bei denen jedes Projekt in einem eigenen separaten Speicher lebt, vereint das Monorepository alles an einem Ort.
Für Swift-Entwickler bietet dies mehrere Vorteile:
- Einheitliche Abhängigkeitsversionen — Sie wissen genau, welche Version einer Bibliothek in allen Projekten verwendet wird.
- Vereinfachtes Refactoring — eine Änderung der API in einer Bibliothek ist sofort in allen abhängigen Projekten sichtbar.
- Gemeinsame Einstellungen — ein SwiftLint, eine CI/CD-Konfiguration, einheitliche Formatierungsregeln.
- Einfache Suche — alles an einem Ort, kein Wechsel zwischen Repositories nötig.
Es gibt jedoch auch Nuancen: Ein Monorepository erfordert Disziplin und eine korrekte Struktur, sonst wird es zur „Müllhalde“. Für Einsteiger ist es jedoch eine hervorragende Möglichkeit, die Code-Organisation zu erlernen.
Struktur eines Monorepositorys für Swift-Projekte
Angenommen, Sie erstellen eine iOS-App mit gemeinsamen Modulen. Eine typische Struktur eines Swift-Monorepositorys könnte so aussehen:
MyMonorepo/├── Apps/│ ├── iOSApp/ # Haupt-iOS-App│ │ ├── Sources/│ │ ├── Resources/│ │ └── Package.swift│ └── macOSApp/ # macOS-Version│ ├── Sources/│ └── Package.swift├── Packages/│ ├── Core/ # Gemeinsame Hilfsprogramme (Netzwerk, Logging)│ │ ├── Sources/│ │ └── Package.swift│ ├── UIComponents/ # Wiederverwendbare UI-Komponenten│ │ ├── Sources/│ │ └── Package.swift│ └── Analytics/ # Analysemodul│ ├── Sources/│ └── Package.swift├── Scripts/ # Hilfsskripte├── .swiftlint.yml # Einheitliche Linter-Konfiguration├── Package.swift # Root-Manifest (optional)└── README.mdBeachten Sie: Hier wird der Swift Package Manager (SPM) verwendet – das Standardwerkzeug zur Verwaltung von Abhängigkeiten in Swift. Jedes Modul ist ein eigenes Swift Package, das mit den Apps verbunden werden kann.
Wie erstelle ich ein Monorepository in Swift: Schritt-für-Schritt-Anleitung
Lassen Sie uns ein einfaches Monorepository mit zwei Modulen und einer App erstellen. Führen Sie die folgenden Schritte im Terminal aus:
Schritt 1: Erstellen Sie das Stammverzeichnis und initialisieren Sie Git
mkdir MyMonorepocd MyMonorepogit initSchritt 2: Erstellen Sie die Ordnerstruktur
mkdir -p Apps/iOSApp/Sourcesmkdir -p Packages/Core/Sourcesmkdir -p Packages/UIComponents/SourcesSchritt 3: Erstellen Sie die Package.swift für das Core-Modul
Erstellen Sie die Datei Packages/Core/Package.swift:
// swift-tools-version:5.9import PackageDescription
let package = Package( name: "Core", platforms: [ .iOS(.v16), .macOS(.v13) ], products: [ .library( name: "Core", targets: ["Core"]) ], targets: [ .target( name: "Core", path: "Sources") ])Schritt 4: Schreiben Sie einfachen Code im Core-Modul
Erstellen Sie Packages/Core/Source