Monorepository mit Swift: Code-Organisation für iOS- und macOS-Projekte

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Monorepository mit Swift: Code-Organisation für iOS- und macOS-Projekte



In der modernen Entwicklung für iOS und macOS beeinflusst die Wahl der Code-Management-Strategie direkt die Entwicklungsgeschwindigkeit, die Qualität des Refactorings und den Komfort der Teamarbeit. Der traditionelle Ansatz mit vielen einzelnen Repositories (Polyrepository) führt oft zu doppelten Abhängigkeiten, Schwierigkeiten bei der Versionssynchronisation und Fragmentierung der Codebasis. Eine Alternative ist das Monorepository (Monorepo) – ein einheitliches Repository für alle Module, Bibliotheken und Anwendungen eines Projekts. In diesem Artikel analysieren wir am Beispiel von Swift und dem Apple-Ökosystem, wie man ein Monorepository organisiert, welche Tools man verwendet und welche Fallstricke zu beachten sind.



Was ist ein Monorepository und warum wird es in Swift-Projekten benötigt?



Ein Monorepository ist eine Versionsverwaltungsstrategie, bei der der gesamte Code eines Projekts (mehrere Anwendungen, Bibliotheken, Konfigurationen) in einem einzigen Git-Repository gespeichert wird. Im Kontext von Swift bedeutet dies, dass Sie in einem Repository Folgendes haben können:



  • iOS-Anwendung (z.B. MyApp)
  • macOS-Anwendung (MyMacApp)
  • gemeinsame Modellbibliothek (CoreModels)
  • Netzwerkschicht (Networking)
  • UI-Komponenten (UIComponents)
  • Tests und CI-Skripte


Vorteile eines Monorepositorys für Swift-Projekte:

  • Einheitliche Version von Abhängigkeiten – alle Module verwenden dieselbe Version einer Bibliothek (z.B. Alamofire oder SwiftUI), was Konflikte ausschließt.
  • Atomare Commits – Änderungen an der API einer Bibliothek und deren Verwendung in der Anwendung werden in einem Commit festgehalten, was Code-Reviews und Rollbacks vereinfacht.
  • Vereinfachtes Refactoring – Sie können eine öffentliche Methode in einem Modul umbenennen und sofort alle Aufrufstellen im selben Repository korrigieren.
  • Gemeinsame CI/CD – eine einzige Pipeline zum Bauen und Testen aller Komponenten.


Tools für die Arbeit mit Monorepository in Swift



Im Apple-Ökosystem gibt es zwei Hauptwerkzeuge zur Organisation eines Monorepositorys: Swift Package Manager (SPM) und Tuist. Betrachten wir ihre Besonderheiten.



Swift Package Manager (SPM)

SPM ist ein integrierter Paketmanager, der sich hervorragend für Monorepositories eignet. Sie definieren Module über Package.swift, und Xcode löst Abhängigkeiten automatisch auf. Beispiel einer Struktur:



MyMonorepo/├── Package.swift├── Sources/│   ├── CoreModels/│   │   └── Models.swift│   ├── Networking/│   │   └── APIClient.swift│   └── UIComponents/│       └── ButtonView.swift├── Apps/│   ├── MyApp/│   │   └── (iOS Projekt)│   └── MyMacApp/│       └── (macOS Projekt)└── Tests/    ├── CoreModelsTests/    └── NetworkingTests/


Beispiel einer Package.swift für ein solches Monorepository:



// swift-tools-version:5.9import PackageDescription

let package = Package( name: "MyMonorepo", platforms: [ .iOS(.v16), .macOS(.v13) ], products: [ .library(name: "CoreModels", targets: ["CoreModels"]), .library(name: "Networking", targets: ["Networking"]), .library(name: "UIComponents", targets: ["UIComponents"]), ], dependencies: [ .package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.8.0") ], targets: [ .target(name: "CoreModels"), .target( name: "Networking", dependencies: ["CoreModels", "Alamofire"] ), .target( name: "UIComponents", dependencies: ["CoreModels"] ), .testTarget(name: "CoreModelsTests", dependencies: ["CoreModels"]), .testTarget(name: "NetworkingTests", dependencies: ["Networking"]), ])

Blogs

Buchempfehlungen