Wat is Carthage en hoe kan het appontwikkeling optimaliseren?

Carthage is een dependency manager voor iOS- en macOS-projecten waarmee ontwikkelaars bibliotheken van derden op een eenvoudige en efficiënte manier in hun applicaties kunnen integreren. Anders dan andere tools zoals CocoaPods richt Carthage zich op minimalisme en het vermijden van ingrepen, wat betekent dat het de structuur van het project niet wijzigt en alleen een eenvoudig tekstbestand vereist, een Cartfile, waarin de afhankelijkheden worden opgesomd. Dit heeft het tot een populaire keuze gemaakt onder ontwikkelaars die de controle over hun projectopzet willen houden en tegelijk willen profiteren van bibliotheken en frameworks van derden.

Carthage werkt door binaire frameworks te bouwen, die vervolgens rechtstreeks in Xcode-projecten kunnen worden geïntegreerd. Deze aanpak betekent dat ontwikkelaars kunnen profiteren van snellere buildtijden en een meer gestroomlijnd ontwikkelproces. Met Carthage kunnen afhankelijkheden eenvoudig worden toegevoegd, bijgewerkt en beheerd zonder complexe configuratiebestanden of ongewenste wijzigingen in het project. Daar staat tegenover dat de gebouwde frameworks handmatig aan Xcode worden toegevoegd. Dit maakt Carthage tot een goede tool voor wie een eenvoudige maar krachtige oplossing voor het beheer van afhankelijkheden in iOS- en macOS-ontwikkelprojecten wil.

Carthage is een gedecentraliseerde dependency manager voor iOS- en macOS-projecten. Het haalt bibliotheken van derden op en bouwt ze als frameworks, die de ontwikkelaar vervolgens zelf aan het Xcode-project toevoegt, zonder dat het projectbestand automatisch wordt gewijzigd. Dit geeft volledige controle over de structuur van het project en kan snellere buildtijden opleveren, omdat de afhankelijkheden alleen worden gebouwd wanneer ze worden bijgewerkt. Carthage wordt vooral gebruikt als eenvoudiger alternatief voor CocoaPods, terwijl Swift Package Manager de ingebouwde oplossing van Apple voor pakketbeheer is.

Meer over Carthage

Carthage is een dependency manager voor iOS en macOS die een eenvoudige en flexibele manier biedt om bibliotheken van derden in projecten te integreren. Anders dan andere tools die de projectopzet automatisch wijzigen, richt Carthage zich op een minimale opzet en geeft het ontwikkelaars de vrijheid hun projecten te beheren zonder onnodige beperkingen.

Technisch gezien werkt Carthage door binaire frameworks uit broncode te bouwen, of kant-en-klare frameworks te downloaden, waardoor ontwikkelaars deze frameworks rechtstreeks in hun Xcode-projecten kunnen opnemen. Dit betekent dat Carthage de projectbestanden niet wijzigt, maar in plaats daarvan een map “Carthage/Build” genereert waarin de gecompileerde frameworks worden opgeslagen. Deze aanpak geeft ontwikkelaars volledige controle over hun projectstructuur en afhankelijkheden.

Carthage ondersteunt drie primaire functies, die elk een andere manier bieden om afhankelijkheden af te handelen:

  1. Afhankelijkheden bouwen: Carthage kan automatisch alle afhankelijkheden bouwen die in een “Cartfile” zijn opgegeven. Dit stelt ontwikkelaars in staat zich op hun eigen code te concentreren terwijl Carthage de compilatie van externe bibliotheken afhandelt. Deze functie is ideaal voor projecten die meerdere bibliotheken van derden vereisen.

  2. Afhankelijkheden bijwerken: Met één opdracht kan Carthage alle afhankelijkheden bijwerken naar de nieuwste versies die aan de versie-eisen in de Cartfile voldoen. Dit maakt het eenvoudig bibliotheken actueel te houden, inclusief beveiligingsfixes, wat belangrijk is voor het behoud van compatibiliteit en beveiliging.

  3. Frameworks integreren: Carthage genereert frameworks die de ontwikkelaar zelf aan het Xcode-project toevoegt, doorgaans onder “Frameworks, Libraries, and Embedded Content”. Dit vereist een handmatige stap, maar geeft volledig inzicht in welke bibliotheken precies deel uitmaken van het project en maakt het eenvoudig te profiteren van nieuwe functies en verbeteringen in bibliotheken van derden.

Een van de grootste sterke punten van Carthage is de eenvoud en flexibiliteit. Door geautomatiseerde projectwijzigingen te vermijden, stelt Carthage ontwikkelaars in staat de controle over hun projecten te houden. Dit verkleint het risico op conflicten in het projectbestand en maakt het eenvoudiger nieuwe afhankelijkheden te integreren zonder bestaande projectstructuren te verstoren.

De aanpak van Carthage voor het beheer van afhankelijkheden bespaart ook tijd in het dagelijkse werk. Door afhankelijkheden alleen te bouwen wanneer ze worden toegevoegd of bijgewerkt, en onnodige projectwijzigingen te vermijden, minimaliseert Carthage de tijd en resources die nodig zijn om een project te onderhouden. Dit maakt het tot een goede tool voor ontwikkelaars die hun workflows willen optimaliseren en zich willen richten op het leveren van software van hoge kwaliteit.

In de praktijk heeft Carthage een aanzienlijke invloed gehad op hoe ontwikkelaars afhankelijkheden in iOS- en macOS-projecten beheren. Het is door zowel kleine als grote ontwikkelteams gebruikt om hun projecten actueel, veilig en eenvoudig te onderhouden te houden. Tegenwoordig is de ontwikkeling van Carthage echter sterk vertraagd, en de meeste bibliotheken richten zich nu in de eerste plaats op Swift Package Manager.

Samengevat is Carthage een tool die eenvoud, flexibiliteit en efficiëntie combineert in een oplossing die het beheer van afhankelijkheden transparanter maakt voor zowel individuele ontwikkelaars als grote teams. De eenvoudige opzet en de minimale ingreep in de projectstructuur hebben het tot een nuttig hulpmiddel gemaakt in appontwikkeling, waar snelle en veilige integraties noodzakelijk zijn.

Veelgestelde vragen over Carthage

Wat is Carthage en hoe werkt het in de praktijk?

Carthage is een gedecentraliseerde dependency manager voor iOS-, macOS-, tvOS- en watchOS-projecten die in Swift en Objective-C zijn geschreven. Er is geen centraal pakketregister. In plaats daarvan verwijst elke afhankelijkheid rechtstreeks naar een Git-repository, doorgaans op GitHub.

De afhankelijkheden worden opgegeven in een tekstbestand met de naam Cartfile in de hoofdmap van het project. Wanneer de opdracht carthage update wordt uitgevoerd, zoekt Carthage geschikte versies, haalt de broncode op in de map Carthage/Checkouts en bouwt elke bibliotheek met de eigen buildtools van Xcode. De voltooide frameworks worden in Carthage/Build geplaatst.

Carthage wijzigt het Xcode-projectbestand niet. De ontwikkelaar voegt de gebouwde frameworks toe onder Frameworks, Libraries, and Embedded Content in het betreffende target. Dit geeft volledige controle over de projectopzet, maar vereist iets meer handmatig werk dan tools die automatisch integreren.

Hoe wordt Carthage geïnstalleerd en hoe wordt een bibliotheek toegevoegd?

Carthage wordt meestal met Homebrew geïnstalleerd met de opdracht brew install carthage. Als alternatief kan een installatiepakket worden gedownload uit de releases van het project op GitHub.

Een bibliotheek wordt doorgaans in vier stappen toegevoegd:

  • Het bestand Cartfile wordt in de hoofdmap van het project aangemaakt met een regel zoals github "Alamofire/Alamofire" ~> 5.0.
  • De opdracht carthage update --use-xcframeworks --platform iOS haalt de bibliotheek op en bouwt die.
  • Het voltooide .xcframework uit Carthage/Build wordt naar Frameworks, Libraries, and Embedded Content in het target van de app gesleept.
  • Voor dynamische frameworks wordt Embed & Sign geselecteerd.

De operator ~> betekent dat nieuwere versies worden geaccepteerd zolang de hoofdversie gelijk blijft. De bibliotheek kan vervolgens in code worden gebruikt met import Alamofire.

Wat is het verschil tussen Cartfile en Cartfile.resolved?

Cartfile beschrijft welke afhankelijkheden het project nodig heeft en aan welke versie-eisen ze moeten voldoen, bijv. ~> 5.0, >= 2.1 of een specifieke branch. Het bestand wordt handmatig bewerkt en drukt de intentie uit.

Cartfile.resolved wordt automatisch gegenereerd en bevat de exacte versies of commits die daadwerkelijk zijn gekozen, ook voor de eigen afhankelijkheden van de afhankelijkheden. Het bestand fungeert als lock, zodat iedereen in een team en elke buildserver precies dezelfde code krijgt.

Het verschil blijkt uit de opdrachten:

  • carthage update zoekt de nieuwste versies die overeenkomen met Cartfile en schrijft het resultaat naar Cartfile.resolved.
  • carthage bootstrap haalt precies de versies op die in Cartfile.resolved staan en bouwt die.

Beide bestanden moeten daarom in versiebeheer worden bewaard. Afhankelijkheden die alleen tijdens de ontwikkeling worden gebruikt, zoals testbibliotheken, kunnen in Cartfile.private worden geplaatst.

Hoe bouwt Carthage XCFrameworks en waarom is dat belangrijk?

Vroeger bouwde Carthage zogenaamde fat frameworks, waarin de code voor fysieke apparaten en de simulator met de tool lipo in één bestand werd gecombineerd. Dit werkte niet meer met Xcode 12, omdat zowel apparaten als simulators op Apple Silicon de arm64-architectuur gebruiken, en dezelfde architectuur niet twee keer in één fat framework kan voorkomen.

De oplossing is XCFrameworks, die Apple met Xcode 11 heeft geïntroduceerd. Een XCFramework is een bundel met een afzonderlijk binair bestand voor elk platform en elke variant, zoals iOS-apparaat en iOS-simulator. Vanaf Carthage 0.37 worden XCFrameworks gebouwd met de vlag --use-xcframeworks, bijv. carthage bootstrap --use-xcframeworks.

Het resultaat wordt als .xcframework-mappen in Carthage/Build geplaatst. Ze worden rechtstreeks aan het target van de app toegevoegd, en de vroegere buildfase met carthage copy-frameworks is niet meer nodig.

Wat is het verschil tussen Carthage, CocoaPods en Swift Package Manager?

De drie tools lossen dezelfde taak op, maar op verschillende manieren:

  • Carthage is gedecentraliseerd en haalt afhankelijkheden rechtstreeks op uit de Git-repository’s die in een Cartfile zijn opgegeven. De bibliotheken worden als binaire frameworks gebouwd, en het Xcode-project wordt niet gewijzigd. De integratie gebeurt handmatig.
  • CocoaPods gebruikt een centraal bibliotheekregister en een Podfile. De opdracht pod install maakt een workspace aan en wijzigt de projectopzet, zodat de integratie automatisch gebeurt, maar minder transparant is. CocoaPods bevindt zich nu in onderhoudsmodus.
  • Swift Package Manager (SPM) is de eigen tool van Apple en is in Xcode ingebouwd. Pakketten worden rechtstreeks in Xcode toegevoegd of beschreven in een Package.swift, en er is geen extra installatie nodig.

Carthage is nuttig wanneer volledige controle over het projectbestand en kortere buildtijden gewenst zijn, omdat de afhankelijkheden alleen worden gebouwd wanneer ze worden bijgewerkt. Voor nieuwe projecten is SPM nu de meest gebruikte keuze, omdat de meeste bibliotheken het ondersteunen.

Hoe kunnen buildtijden met Carthage laag worden gehouden?

Omdat Carthage afhankelijkheden standaard uit broncode bouwt, kan de eerste build lang duren. Verschillende opties kunnen de tijd verkorten:

  • --platform iOS beperkt de build tot de platforms die het project daadwerkelijk gebruikt.
  • --cache-builds slaat afhankelijkheden over die al in dezelfde versie zijn gebouwd, zodat alleen gewijzigde bibliotheken opnieuw worden gebouwd.
  • Afzonderlijke afhankelijkheden kunnen apart worden bijgewerkt, bijv. met carthage update Alamofire, in plaats van ze allemaal bij te werken.
  • Veel bibliotheken bieden kant-en-klare frameworks in hun GitHub-releases, die Carthage automatisch downloadt. SDK’s met gesloten broncode kunnen worden opgegeven met binary en een URL naar een JSON-specificatie.

Op buildservers kan de map Carthage/Build ook tussen runs worden gecachet. Veel teams houden de map via .gitignore buiten Git en maken die opnieuw aan met carthage bootstrap.

Carthage voor dummies

Carthage is een tool die helpt de kleine bouwstenen te organiseren en te beheren waaruit apps bestaan, die “afhankelijkheden” worden genoemd. Stel je voor dat je een app bouwt die een paar kant-en-klare onderdelen nodig heeft die anderen al hebben gemaakt, zodat de app beter werkt. Carthage helpt deze onderdelen op te halen en bij te houden, zodat ze niet vanaf nul hoeven te worden gemaakt. Het werkt een beetje als een bibliothecaris die alle boeken bijhoudt die voor een project nodig zijn, zodat de schrijver zich op zijn of haar eigen verhaal kan richten. Het maakt het ontwikkelen van apps eenvoudiger en sneller, omdat het werk van anderen kan worden hergebruikt terwijl ervoor wordt gezorgd dat alles in elkaar past.

Plaats een reactie