Was ist Carthage und wie kann es die App-Entwicklung optimieren?

Carthage ist ein Dependency Manager für iOS- und macOS-Projekte, mit dem Entwickler Bibliotheken von Drittanbietern einfach und effizient in ihre Anwendungen integrieren können. Anders als andere Tools wie CocoaPods ist Carthage bewusst minimalistisch und wenig invasiv angelegt, das heißt, es verändert die Struktur des Projekts nicht und benötigt nur eine einfache Textdatei, ein Cartfile, in dem die Abhängigkeiten aufgeführt sind. Das hat es zu einer beliebten Wahl bei Entwicklern gemacht, die die Kontrolle über ihr Projekt-Setup behalten und zugleich von Bibliotheken und Frameworks von Drittanbietern profitieren wollen.

Carthage baut binäre Frameworks, die sich anschließend direkt in Xcode-Projekte integrieren lassen. Durch diesen Ansatz profitieren Entwickler von kürzeren Build-Zeiten und einem schlankeren Entwicklungsprozess. Mit Carthage lassen sich Abhängigkeiten einfach hinzufügen, aktualisieren und verwalten, ohne komplexe Konfigurationsdateien oder unerwünschte Änderungen am Projekt. Im Gegenzug werden die gebauten Frameworks manuell zu Xcode hinzugefügt. Das macht Carthage zu einem guten Werkzeug für alle, die in ihren iOS- und macOS-Entwicklungsprojekten eine einfache, aber leistungsstarke Lösung für das Abhängigkeitsmanagement suchen.

Carthage ist ein dezentraler Dependency Manager für iOS- und macOS-Projekte. Er ruft Bibliotheken von Drittanbietern ab und baut sie als Frameworks, die der Entwickler anschließend selbst zu seinem Xcode-Projekt hinzufügt, ohne dass die Projektdatei automatisch verändert wird. Das gibt volle Kontrolle über die Struktur des Projekts und kann kürzere Build-Zeiten ermöglichen, da die Abhängigkeiten nur bei einer Aktualisierung neu gebaut werden. Carthage wird vor allem als einfachere Alternative zu CocoaPods genutzt, während Swift Package Manager Apples integrierte Lösung für das Paketmanagement ist.

Mehr über Carthage

Carthage ist ein Dependency Manager für iOS und macOS, der eine einfache und flexible Möglichkeit bietet, Bibliotheken von Drittanbietern in Projekte zu integrieren. Anders als andere Tools, die das Projekt-Setup automatisch verändern, setzt Carthage auf minimale Einrichtung und gibt Entwicklern die Freiheit, ihre Projekte ohne unnötige Einschränkungen zu verwalten.

Technisch baut Carthage binäre Frameworks aus Quellcode oder lädt vorgefertigte herunter, sodass Entwickler diese Frameworks direkt in ihre Xcode-Projekte einbinden können. Carthage verändert die Projektdateien also nicht, sondern erzeugt einen Ordner „Carthage/Build“, in dem die kompilierten Frameworks abgelegt werden. Dieser Ansatz gibt Entwicklern volle Kontrolle über ihre Projektstruktur und Abhängigkeiten.

Carthage unterstützt drei Hauptfunktionen, die jeweils einen anderen Umgang mit Abhängigkeiten ermöglichen:

  1. Abhängigkeiten bauen: Carthage kann automatisch alle in einem „Cartfile“ angegebenen Abhängigkeiten bauen. So können sich Entwickler auf ihren eigenen Code konzentrieren, während Carthage die Kompilierung externer Bibliotheken übernimmt. Diese Funktion eignet sich ideal für Projekte, die mehrere Bibliotheken von Drittanbietern benötigen.

  2. Abhängigkeiten aktualisieren: Mit einem einzigen Befehl kann Carthage alle Abhängigkeiten auf die neuesten Versionen aktualisieren, die die Versionsanforderungen im Cartfile erfüllen. Das macht es leicht, Bibliotheken einschließlich Sicherheitskorrekturen aktuell zu halten, was für Kompatibilität und Sicherheit wichtig ist.

  3. Frameworks integrieren: Carthage erzeugt Frameworks, die der Entwickler selbst zum Xcode-Projekt hinzufügt, typischerweise unter „Frameworks, Libraries, and Embedded Content“. Das erfordert einen manuellen Schritt, gibt aber vollen Einblick, welche Bibliotheken genau Teil des Projekts sind, und macht es leicht, von neuen Funktionen und Verbesserungen in Bibliotheken von Drittanbietern zu profitieren.

Eine der größten Stärken von Carthage ist seine Einfachheit und Flexibilität. Durch den Verzicht auf automatische Projektänderungen behalten Entwickler die Kontrolle über ihre Projekte. Das verringert das Risiko von Konflikten in der Projektdatei und erleichtert die Integration neuer Abhängigkeiten, ohne bestehende Projektstrukturen zu stören.

Der Ansatz von Carthage beim Abhängigkeitsmanagement spart zudem Zeit im Arbeitsalltag. Da Abhängigkeiten nur beim Hinzufügen oder Aktualisieren gebaut und unnötige Projektänderungen vermieden werden, minimiert Carthage Zeit und Ressourcen für die Pflege eines Projekts. Das macht es zu einem guten Werkzeug für Entwickler, die ihre Workflows optimieren und sich auf die Auslieferung hochwertiger Software konzentrieren wollen.

In der Praxis hat Carthage die Art, wie Entwickler Abhängigkeiten in iOS- und macOS-Projekten verwalten, maßgeblich beeinflusst. Kleine wie große Entwicklungsteams haben es genutzt, um ihre Projekte aktuell, sicher und leicht wartbar zu halten. Heute hat sich die Weiterentwicklung von Carthage jedoch deutlich verlangsamt, und die meisten Bibliotheken richten sich inzwischen vorrangig an Swift Package Manager.

Zusammenfassend ist Carthage ein Werkzeug, das Einfachheit, Flexibilität und Effizienz in einer Lösung vereint, die das Abhängigkeitsmanagement für einzelne Entwickler wie große Teams transparenter macht. Die einfache Einrichtung und der minimale Eingriff in die Projektstruktur haben es zu einem nützlichen Werkzeug der App-Entwicklung gemacht, in der schnelle und sichere Integrationen notwendig sind.

Häufig gestellte Fragen über Carthage

Was ist Carthage und wie funktioniert es in der Praxis?

Carthage ist ein dezentraler Dependency Manager für iOS-, macOS-, tvOS- und watchOS-Projekte in Swift und Objective-C. Es gibt kein zentrales Paketverzeichnis. Stattdessen verweist jede Abhängigkeit direkt auf ein Git-Repository, typischerweise auf GitHub.

Die Abhängigkeiten werden in einer Textdatei namens Cartfile im Stammordner des Projekts angegeben. Beim Ausführen des Befehls carthage update ermittelt Carthage passende Versionen, lädt den Quellcode in den Ordner Carthage/Checkouts und baut jede Bibliothek mit den Build-Tools von Xcode. Die fertigen Frameworks werden in Carthage/Build abgelegt.

Carthage verändert die Xcode-Projektdatei nicht. Der Entwickler fügt die gebauten Frameworks im jeweiligen Target unter Frameworks, Libraries, and Embedded Content hinzu. Das gibt volle Kontrolle über das Projekt-Setup, erfordert aber etwas mehr manuelle Arbeit als Tools mit automatischer Integration.

Wie wird Carthage installiert und wie wird eine Bibliothek hinzugefügt?

Carthage wird meist mit Homebrew über den Befehl brew install carthage installiert. Alternativ lässt sich ein Installationspaket aus den Releases des Projekts auf GitHub herunterladen.

Eine Bibliothek wird typischerweise in vier Schritten hinzugefügt:

  • Im Stammordner des Projekts wird die Datei Cartfile mit einer Zeile wie github "Alamofire/Alamofire" ~> 5.0 angelegt.
  • Der Befehl carthage update --use-xcframeworks --platform iOS lädt und baut die Bibliothek.
  • Das fertige .xcframework aus Carthage/Build wird in Frameworks, Libraries, and Embedded Content im Target der App gezogen.
  • Bei dynamischen Frameworks wird Embed & Sign ausgewählt.

Der Operator ~> bedeutet, dass neuere Versionen akzeptiert werden, solange die Hauptversion gleich bleibt. Anschließend lässt sich die Bibliothek im Code mit import Alamofire verwenden.

Was ist der Unterschied zwischen Cartfile und Cartfile.resolved?

Cartfile beschreibt, welche Abhängigkeiten das Projekt benötigt und welche Versionsanforderungen sie erfüllen müssen, z. B. ~> 5.0, >= 2.1 oder ein bestimmter Branch. Die Datei wird manuell bearbeitet und drückt die Absicht aus.

Cartfile.resolved wird automatisch erzeugt und enthält die exakten Versionen oder Commits, die tatsächlich gewählt wurden, auch für die Abhängigkeiten der Abhängigkeiten. Die Datei fungiert als Sperre, sodass alle im Team und jeder Build-Server genau denselben Code erhalten.

Der Unterschied zeigt sich bei den Befehlen:

  • carthage update ermittelt die neuesten Versionen, die zu Cartfile passen, und schreibt das Ergebnis in Cartfile.resolved.
  • carthage bootstrap lädt und baut genau die in Cartfile.resolved aufgeführten Versionen.

Beide Dateien sollten daher in der Versionskontrolle liegen. Abhängigkeiten, die nur während der Entwicklung benötigt werden, etwa Testbibliotheken, lassen sich in Cartfile.private ablegen.

Wie baut Carthage XCFrameworks und warum ist das wichtig?

Früher baute Carthage sogenannte Fat Frameworks, bei denen der Code für physische Geräte und den Simulator mit dem Tool lipo in einer Datei zusammengeführt wurde. Das funktioniert seit Xcode 12 nicht mehr, da sowohl Geräte als auch Simulatoren auf Apple Silicon die Architektur arm64 nutzen und dieselbe Architektur nicht zweimal in einem Fat Framework vorkommen kann.

Die Lösung sind XCFrameworks, die Apple mit Xcode 11 eingeführt hat. Ein XCFramework ist ein Bundle mit einer eigenen Binärdatei für jede Plattform und Variante, etwa iOS-Gerät und iOS-Simulator. Ab Carthage 0.37 werden XCFrameworks mit dem Flag --use-xcframeworks gebaut, z. B. carthage bootstrap --use-xcframeworks.

Das Ergebnis wird als .xcframework-Ordner in Carthage/Build abgelegt. Diese werden direkt zum Target der App hinzugefügt, und die frühere Build-Phase mit carthage copy-frameworks ist nicht mehr nötig.

Was ist der Unterschied zwischen Carthage, CocoaPods und Swift Package Manager?

Die drei Tools lösen dieselbe Aufgabe, aber auf unterschiedliche Weise:

  • Carthage ist dezentral und lädt Abhängigkeiten direkt aus den in einem Cartfile angegebenen Git-Repositories. Die Bibliotheken werden als binäre Frameworks gebaut, und das Xcode-Projekt wird nicht verändert. Die Integration erfolgt manuell.
  • CocoaPods nutzt ein zentrales Bibliotheksverzeichnis und ein Podfile. Der Befehl pod install erstellt einen Workspace und verändert das Projekt-Setup, sodass die Integration automatisch, aber weniger transparent erfolgt. CocoaPods befindet sich inzwischen im Wartungsmodus.
  • Swift Package Manager (SPM) ist Apples eigenes Tool und in Xcode integriert. Pakete werden direkt in Xcode hinzugefügt oder in einer Package.swift beschrieben, und eine zusätzliche Installation ist nicht nötig.

Carthage ist nützlich, wenn volle Kontrolle über die Projektdatei und kürzere Build-Zeiten gewünscht sind, da die Abhängigkeiten nur bei einer Aktualisierung gebaut werden. Für neue Projekte ist SPM inzwischen die am weitesten verbreitete Wahl, da die meisten Bibliotheken es unterstützen.

Wie lassen sich die Build-Zeiten mit Carthage niedrig halten?

Da Carthage Abhängigkeiten standardmäßig aus Quellcode baut, kann der erste Build lange dauern. Mehrere Optionen können die Zeit verkürzen:

  • --platform iOS beschränkt den Build auf die Plattformen, die das Projekt tatsächlich nutzt.
  • --cache-builds überspringt Abhängigkeiten, die bereits in derselben Version gebaut wurden, sodass nur geänderte Bibliotheken neu gebaut werden.
  • Einzelne Abhängigkeiten lassen sich separat aktualisieren, etwa mit carthage update Alamofire, statt alle auf einmal zu aktualisieren.
  • Viele Bibliotheken stellen in ihren GitHub-Releases vorgefertigte Frameworks bereit, die Carthage automatisch herunterlädt. Closed-Source-SDKs lassen sich mit binary und einer URL zu einer JSON-Spezifikation angeben.

Auf Build-Servern lässt sich zudem der Ordner Carthage/Build zwischen den Durchläufen cachen. Viele Teams halten den Ordner per .gitignore aus Git heraus und erzeugen ihn mit carthage bootstrap neu.

Carthage für Dummies

Carthage ist ein Werkzeug, das hilft, die kleinen Bausteine zu ordnen und zu verwalten, aus denen Apps bestehen, die sogenannten „Abhängigkeiten“. Stell dir vor, du baust eine App, die ein paar fertige Teile braucht, die andere schon entwickelt haben, damit sie besser funktioniert. Carthage hilft dir, diese Teile zu holen und den Überblick zu behalten, damit du sie nicht von Grund auf selbst bauen musst. Das funktioniert ein bisschen wie ein Bibliothekar, der alle Bücher im Blick behält, die du für ein Projekt brauchst, damit du dich auf deine eigene Geschichte konzentrieren kannst. So wird die App-Entwicklung einfacher und schneller, weil du die Arbeit anderer wiederverwenden kannst und trotzdem sichergestellt ist, dass alles zusammenpasst.

Schreibe einen Kommentar