Carthage: co to je, decentralizovaný správce závislostí

Autor: IT Sectr Publikováno: 2026-02-12 Doba čtení: 8 min

Carthage — decentralizovaný správce závislostí pro Cocoa projekty (iOS, macOS, watchOS, tvOS), který sestavuje binární frameworky ze zdrojového kódu. Na rozdíl od CocoaPods, Carthage neupravuje projekt automaticky — vývojář přidává sestavené frameworky do Xcode ručně. Carthage je napsán v Swiftu, používá Cartfile pro popis závislostí a podporuje paralelní sestavování. Podle údajů GitHub repozitáře nasbíral Carthage přes 15 000 hvězdiček a zůstává specializovaným, ale vyhledávaným nástrojem pro projekty, kde je vyžadován minimální zásah do konfigurace Xcode.

Hlavní body

  • Carthage — decentralizovaný správce závislostí: žádný centrální registr, knihovny se připojují přímo z Git repozitářů
  • Cartfile — konfigurační soubor, ve kterém jsou uvedeny závislosti, jejich verze a zdroje (Git, GitHub, GitLab)
  • Sestavování frameworků se provádí příkazem carthage bootstrap nebo carthage update — Carthage klonuje repozitáře a kompiluje je do .xcframework
  • Integrace s Xcode — ruční: vývojář přidává sestavené frameworky do General → Frameworks, Libraries, and Embedded Content
  • Cartfile.resolved fixuje přesné verze závislostí a zajišťuje reprodukovatelnost sestavení podobně jako Podfile.lock
  • Carthage vs CocoaPods vs SPM: Carthage poskytuje maximální kontrolu, ale vyžaduje více ruční práce; CocoaPods vše automatizuje; SPM je integrován v Xcode

Co je Carthage?

Carthage — správce závislostí s decentralizovanou architekturou, vytvořený v roce 2014 vývojáři z komunity Swift. Carthage nepoužívá centrální registr specifikací — každá knihovna se připojuje přímo z Git repozitáře pomocí URL nebo názvu na GitHubu. Carthage stahuje zdrojový kód, sestavuje jej do binárního frameworku (.xcframework nebo .framework) a poskytuje vývojáři hotový artefakt k ruční integraci do projektu Xcode.

Architektura Carthage zahrnuje tři komponenty: CLI nástroj carthage, konfigurační soubor Cartfile a adresář Carthage/Build/ se sestavenými frameworky. Principiální rozdíl Carthage oproti CocoaPods — absence automatické modifikace .xcodeproj. Carthage nevytváří .xcworkspace, nenastavuje příznaky kompilátoru a negeneruje Pods.xcconfig. Vývojář přidává frameworky do projektu ručně přes Xcode, což poskytuje plnou kontrolu nad procesem integrace.

Carthage používá paralelní sestavování závislostí, což výrazně urychluje proces na vícejádrových procesorech. Každá závislost je sestavena jako samostatný cíl a Carthage automaticky řeší graf tranzitivních závislostí a sestavuje je ve správném pořadí. Podle benchmarků komunity sestavuje Carthage 15–20 závislostí v průměru za 30–60 sekund na moderních Macích, což je rychlejší než CocoaPods pro projekty s velkým počtem knihoven. Carthage podporuje všechny platformy Apple: iOS, macOS, watchOS a tvOS a od verze 0.38+ — sestavování univerzálních .xcframework pro podporu simulátorů a zařízení Apple Silicon.

Jak Carthage funguje

Carthage klonuje Git repozitář každé závislosti, přepne se na zadanou verzi (tag, commit nebo větev) a spustí xcodebuild pro sestavení frameworku. Carthage určuje typ projektu Xcode (framework, dynamic framework, statická knihovna) automaticky podle schématu sestavení. Pokud projekt obsahuje více schémat, Carthage použije výchozí schéma (první v abecedním pořadí). Po sestavení Carthage zkopíruje hotový framework do Carthage/Build/ a vytvoří soubor Cartfile.resolved s fixací přesných verzí. Carthage podporuje ukládání sestavených frameworků do mezipaměti — opětovné sestavení bez změn závislostí se neprovádí.

Tranzitivní závislosti v Carthage jsou zpracovávány přes Cartfile.resolved: Carthage vytvoří graf všech potřebných závislostí a sestaví je ve správném pořadí. Pokud dvě knihovny závisí na stejné knihovně třetí strany, Carthage ji sestaví jednou a použije pro obě. Carthage oznamuje chyby sestavení s uvedením konkrétního cíle a příčiny — to zjednodušuje diagnostiku problémů.

Cartfile: struktura, syntaxe a příklady

Cartfile — konfigurační soubor v jazyce Ruby (formát Cartfile), který definuje závislosti projektu Carthage. Cartfile se nachází v kořenu projektu vedle .xcodeproj. Každý řádek Cartfile popisuje jednu závislost: zdroj (Git-URL, GitHub repozitář) a verzi. Syntaxe podporuje fixaci verzí pomocí tagů, commitů a větví.

ruby
# Základní závislosti Carthage
github "Alamofire/Alamofire" ~> 5.9
github "SnapKit/SnapKit" ~> 5.7
github "onevcat/Kingfisher" == 8.0.0

Direktiva github "Owner/Repo" — zkrácená forma pro GitHub repozitáře. Carthage automaticky vytvoří URL ve tvaru https://github.com/Owner/Repo.git. Pro GitLab, Bitbucket a další Git hostitele se používá plné URL: git "https://gitlab.com/owner/repo.git". Operátory verzí: ~> 5.9 (libovolná verze od 5.9 do 6.0 s výjimkou 6.0), == 8.0.0 (přesná verze), >= 1.0 (minimální verze). Připojení konkrétního commitu lze provést přes github "owner/repo" "abc1234".

Úplný příklad Cartfile

Carthage podporuje několik adresářů pro různé konfigurace: Cartfile(hlavní), Cartfile.private (pro interní závislosti, které se nezveřejňují) a Cartfile.resolved (generuje se automaticky). Soukromé závislosti jsou užitečné pro knihovny používané pouze v Development sestavení, například testovací frameworky.

ruby
# Cartfile — základní závislosti
github "Alamofire/Alamofire" ~> 5.9
github "SwiftyJSON/SwiftyJSON" ~> 4.0
github "realm/realm-swift" ~> 10.0

# Úplná URL pro GitLab
git "https://gitlab.com/company/internal-lib.git" == 2.1.1

# Vývojová větev
github "marmelroy/PhoneNumberKit" "development"

github a git — dva typy zdrojů v Cartfile. První je určen výhradně pro GitHub a automaticky vytváří URL. Druhý — pro libovolné veřejné nebo soukromé Git repozitáře s plným URL. Verze může být specifikována tagem (== 2.1.1), sémantickým rozsahem (~> 5.9), názvem větve ("development") nebo hash commitu ("a1b2c3d"). Použití sémantických rozsahů (~>) se doporučuje pro závislosti, které dodržují SemVer — chrání to před breaking changes při aktualizaci.

Cartfile.resolved se generuje automaticky po carthage update. Fixuje přesné verze všech nainstalovaných závislostí, včetně tranzitivních. Soubor by měl být uchováván v Git — bez něj příkaz carthage bootstrap na jiném počítači sestaví knihovny podle stejných pravidel, ale verze se mohou lišit. carthage outdated zobrazuje seznam zastaralých závislostí, pro které jsou k dispozici nové verze.

Instalace a konfigurace Carthage

Carthage se instaluje přes Homebrew — standardního správce balíčků pro macOS. Alternativní způsoby: instalace z hotového .pkg instalátoru z GitHubu nebo sestavení ze zdrojového kódu. Carthage vyžaduje Xcode s Command Line Tools (včetně xcodebuild), a na Apple Silicon Mac — Rosetta 2 pro některé starší závislosti.

bash
# Instalace Carthage přes Homebrew
brew install carthage

# Kontrola verze
carthage version

# Instalace z .pkg (pokud Homebrew není k dispozici)
# Stáhnout Carthage.pkg z GitHub Releases a nainstalovat ručně

Po instalaci začíná inicializace projektu Carthage vytvořením Cartfile v kořenu projektu. Carthage nemá příkaz init — soubor se vytváří ručně v textovém editoru. Po naplnění Cartfile závislostmi vývojář spustí carthage bootstrap (pokud Cartfile.resolved již existuje) nebo carthage update (první instalace nebo aktualizace). Carthage klonuje repozitáře, sestavuje frameworky a umísťuje je do Carthage/Build/.

Aktualizace Carthage se provádí přes brew upgrade carthage. Verze se kontroluje příkazem carthage version. Poslední stabilní verze v polovině 2025 — 0.40 s výchozí podporou .xcframework, vylepšeným paralelním sestavováním a plnou podporou Swift 6. Od verze 0.39 Carthage přestal sestavovat zastaralé .framework bez kompatibilního mostu — doporučuje se explicitně uvádět --use-xcframeworks.

bash
# Aktualizace Carthage přes Homebrew
brew upgrade carthage

# Instalace konkrétní verze
brew install carthage@0.39

# Úplná přeinstalace
brew uninstall carthage && brew install carthage

Poznámka: Carthage nevytváří .xcworkspace a nemodifikuje .xcodeproj. Na rozdíl od CocoaPods, Carthage ponechává plnou kontrolu nad konfigurací Xcode vývojáři. To znamená, že po instalaci závislostí je třeba ručně přidat frameworky do Xcode (viz sekce «Integrace Carthage frameworků do Xcode»). Carthage také vyžaduje, aby každá závislost obsahovala projekt Xcode nebo workspace s cílem frameworku — jinak sestavení skončí chybou.

Sestavování frameworků: bootstrap a update

Carthage nabízí tři hlavní příkazy pro práci se závislostmi: bootstrap, update a build. carthage bootstrap sestavuje závislosti z existujícího Cartfile.resolved — doporučeno pro CI prostředí a vývojáře připojující se k projektu. carthage update aktualizuje Cartfile.resolved na nejnovější verze (s ohledem na omezení Cartfile) a provádí sestavení. carthage build sestavuje všechny zadané závislosti bez ukládání verzí.

bash
# První instalace (aktualizuje verze)
carthage update --use-xcframeworks --platform iOS

# Opětovné sestavení podle pevných verzí
carthage bootstrap --use-xcframeworks --platform iOS

# Sestavení pouze jedné závislosti
carthage build Alamofire --platform iOS

Příznak --use-xcframeworks dává Carthage pokyn sestavovat univerzální .xcframework místo zastaralých .framework. To zajišťuje podporu jak simulátoru, tak skutečného zařízení, stejně jako Apple Silicon Mac bez dalších skriptů. Příznak --platform iOS omezuje sestavení na jednu platformu iOS — to výrazně urychluje proces, zejména pokud projekt obsahuje multiplatformní knihovny.

Carthage podporuje paralelní sestavování přes příznak --cache-builds, který ukládá do mezipaměti již sestavené frameworky. Při opětovném sestavení Carthage kontroluje hash commitu Git a pokud se kód nezměnil, kompilaci přeskočí. Pro CI servery se doporučuje ukládat do mezipaměti adresář Carthage/Build/ a ~/Library/Caches/carthage/. Carthage také podporuje --verbose pro podrobné logování a --no-use-binaries pro vynucené sestavení ze zdrojového kódu (pokud vývojář nedůvěřuje předpřipraveným binárkám).

PříkazAkce
carthage updateAktualizuje Cartfile.resolved a sestaví všechny frameworky
carthage bootstrapSestaví frameworky podle existujícího Cartfile.resolved bez aktualizace
carthage buildSestaví zadané závislosti bez fixace verzí
carthage outdatedZobrazí seznam závislostí s dostupnými aktualizacemi
carthage checkoutPouze klonuje repozitáře bez sestavení

Integrace Carthage frameworků do Xcode

Integrace Carthage frameworků do Xcode se provádí ručně ve čtyřech krocích. Po provedení carthage update nebo bootstrap jsou všechny sestavené frameworky v Carthage/Build/iOS/ (nebo příslušné platformě). Vývojář otevře projekt Xcode, vybere cíl aplikace a přidá frameworky do General → Frameworks, Libraries, and Embedded Content. Pro runtime frameworky (dynamické knihovny) je třeba vybrat «Embed & Sign» — jinak aplikace spadne při spuštění s chybou «dyld: Library not loaded».

Carthage pro statické knihovny funguje jednodušeji — nevyžadují fázi embed, protože se linkují přímo do spustitelného souboru aplikace. Carthage však ve výchozím nastavení sestavuje dynamické frameworky (kromě explicitně nakonfigurovaných statických knihoven). Pro projekty, kde je důležité minimalizovat velikost aplikace, se doporučuje používat statické linkování přes nastavení Xcode.

Další krok — přidání Input Files do Build Phase → Run Script. Carthage vyžaduje skript pro odstranění artefaktů simulátoru ze sestaveného frameworku (strip simulator architectures). Tento skript je nezbytný pro sestavení pro App Store:

bash
# Run Script pro App Store (strip simulator architectures)
FRAMEWORKS_DIR="${SRCROOT}/Carthage/Build/iOS"
for framework in "$FRAMEWORKS_DIR"/*.framework; do
  bash "$BUILD_DIR/src/scripts/strip-framework.sh" "$framework"
done

Carthage nevyžaduje použití .xcworkspace — všechny závislosti jsou již sestaveny do binárních frameworků. Carthage pracuje přímo s .xcodeproj, na rozdíl od CocoaPods, který vytváří workspace. To zjednodušuje správu verzí a konfiguraci CI, protože závislosti Carthage nemění konfiguraci projektu Xcode. Jedinou změnou je přidání frameworků do cíle, které je zaznamenáno v .pbxproj.

KrokAkce
1Proveďte carthage update --use-xcframeworks
2Přetáhněte frameworky z Carthage/Build/ do General → Frameworks
3Nastavte Embed & Sign pro dynamické frameworky
4Přidejte Run Script Phase pro odstranění architektur simulátoru
5Sestavte projekt — frameworky by se měly linkovat automaticky

Carthage vs CocoaPods vs Swift Package Manager

Carthage, CocoaPods a Swift Package Manager (SPM) — tři hlavní správci závislostí ve vývoji pro iOS. Carthage se vyznačuje decentralizovaným přístupem, CocoaPods nabízí centralizovaný registr, SPM — vestavěné řešení od Apple. Volba mezi nimi závisí na požadavcích projektu, velikosti týmu a požadované úrovni automatizace.

KritériumCarthageCocoaPodsSPM
ArchitekturaDecentralizovanáCentralizovaný registrIntegrován v Xcode
Jazyk konfiguraceCartfile (podobný Ruby)Podfile (Ruby DSL)Package.swift (Swift)
Integrace s XcodeRuční (drag & drop)Přes workspaceVestavěná
Tranzitivní závislostiAutomatickyAutomatickyAutomaticky
Registr knihovenNe (Git repozitáře)100 000+ v Specs~65 000
Podpora zdrojůNeAno (resource bundles)Ano (Resources)
Rychlost sestaveníRychlá (paralelní)StředníRychlá
Kontrola integracePlnáAutomatickáAutomatická

Carthage se volí pro projekty, kde je vyžadován minimální zásah do konfigurace Xcode a plná kontrola nad procesem integrace. Carthage je ideální pro otevřené knihovny a frameworky, kde autor chce dát uživatelům možnost sestavovat závislosti samostatně. Carthage je také populární v komunitě vývojářů, kteří oceňují UNIX filozofii: každý nástroj dělá jednu věc dobře. CocoaPods zůstává standardem pro podnikové projekty s desítkami závislostí, kde je důležitá automatizace. SPM — volba pro nové projekty, protože je integrován v Xcode a aktivně vyvíjen Apple.

Migrace mezi správci vyžaduje různý přístup. Carthage → SPM: odstraňte frameworky z Xcode, smažte Cartfile a přidejte Package Dependencies přes File → Add Package Dependencies. Carthage → CocoaPods: odstraňte Carthage frameworky, vytvořte Podfile, přidejte závislosti a spusťte pod init && pod install. Při migraci z Carthage na CocoaPods nebo SPM mizí potřeba ručně aktualizovat frameworky — všechny závislosti se aktualizují jedním příkazem. Carthage zůstává relevantní pro projekty, kde je důležité vyhnout se vendor lock-in a zachovat transparentnost sestavování závislostí.

Běžné problémy a jejich řešení

Carthage — stabilní nástroj, ale vývojáři občas narazí na typické problémy, zejména při sestavování na CI serverech, aktualizaci Xcode nebo změně verzí Swift. Většina problémů se řeší vyčištěním mezipaměti, správnou konfigurací --use-xcframeworks a kontrolou souladu s minimální verzí iOS.

Chyba «The file manager returned an error» — vzniká při poškození mezipaměti Carthage nebo konfliktu přístupových práv k souborům. Řešení: odstraňte mezipaměť příkazem rm -rf ~/Library/Caches/carthage a znovu spusťte carthage bootstrap. Pomáhá také odstranění adresáře Carthage/ v projektu a opětovné sestavení. Na CI serverech by se mezipaměť Carthage měla aktualizovat pouze při změně Cartfile.resolved.

Chyba «No such module» — framework nebyl nalezen v Xcode, přestože sestavení Carthage bylo úspěšné. Řešení: zkontrolujte cestu frameworku v General → Frameworks, Libraries, and Embedded Content. Framework by měl být v Carthage/Build/iOS/. Ujistěte se, že .xcframework byl přidán správně (přetáhněte znovu). Pro dynamické frameworky zkontrolujte Embed & Sign. Pokud chyba přetrvává — přidejte FRAMEWORK_SEARCH_PATHS do Build Settings.

Chyba při sestavení kvůli nekompatibilitě Swift — knihovna je sestavena pro jinou verzi Swift než projekt. Řešení: použijte carthage update --no-use-binaries pro vynucené sestavení ze zdrojového kódu stejnou verzí Swift. Pokud se knihovna nezkompiluje pod aktuální verzí — použijte .xcconfig pro uvedení verze Swift nebo forkujte knihovnu. Od Carthage 0.39, --use-xcframeworks automaticky zahrnuje správnou verzi Swift do binárky.

Problémy s CI sestavením — Carthage na CI vyžaduje správnou konfiguraci ukládání do mezipaměti. Řešení: ukládejte do mezipaměti Carthage/Build/ a ~/Library/Caches/carthage/. Používejte carthage bootstrap --use-xcframeworks --platform iOS místo update na CI, abyste neměnili verze. Pro GitHub Actions je k dispozici oficiální Carthage akce. Pro Jenkins — plugin CarthageBuild. Carthage může spadnout na macOS bez GUI — řešení: nainstalujte brew install xcode-build-server nebo přidejte klíč -UseModernBuildSystem=NO.

ProblémPříčinaŘešení
File manager errorPoškozená mezipaměťVyčistěte ~/Library/Caches/carthage/
No such moduleFramework nepřidán do XcodeZkontrolujte Frameworky v cíli
Nekompatibilita SwiftRůzné verze Swift--no-use-binaries nebo nová verze Carthage
Chyba na CIChybí mezipaměť nebo GUINakonfigurujte mezipaměť Carthage/Build/
Knihovna se nesestavíKnihovna nemá projekt XcodeZkontrolujte strukturu repozitáře

Často kladené dotazy

Co je Carthage a čím se liší od CocoaPods?

Carthage — decentralizovaný správce závislostí pro platformy Apple. Na rozdíl od CocoaPods, Carthage nepoužívá centrální registr knihoven, neupravuje projekt Xcode automaticky a nevytváří .xcworkspace. Carthage sestavuje závislosti do binárních frameworků, které vývojář ručně přidává do Xcode. CocoaPods naopak celý proces automatizuje přes Podfile.

Jak nainstalovat Carthage na macOS?

Carthage se instaluje přes Homebrew: brew install carthage. Alternativně — stáhněte Carthage.pkg z GitHub Releases nebo sestavte ze zdrojového kódu. Po instalaci zkontrolujte verzi: carthage version. Carthage vyžaduje Xcode s Command Line Tools. Na Apple Silicon Mac může být navíc potřeba Rosetta 2.

Čím se liší Cartfile od Cartfile.resolved?

Cartfile — konfigurační soubor psaný vývojářem: obsahuje názvy knihoven a operátory verzí (~> 5.9, == 8.0.0, název větve). Cartfile.resolved se generuje automaticky při carthage update a fixuje přesné verze všech nainstalovaných závislostí. Cartfile.resolved by měl být uchováván v Git — zaručuje reprodukovatelnost sestavení na všech počítačích.

Proč Carthage nesestaví knihovnu z mého Cartfile?

Carthage vyžaduje, aby knihovna obsahovala správný projekt Xcode nebo workspace s cílem frameworku. Zkontrolujte, zda je repozitář přístupný (není soukromý bez klíče), je uvedena správná verze (tag nebo commit existuje) a knihovna podporuje vaši verzi Xcode. Použijte carthage build --verbose pro podrobnou diagnostiku. Pokud knihovna nemá cíl frameworku, Carthage ji nebude moci sestavit.

Má cenu používat Carthage v letech 2025–2026?

Carthage zůstává relevantní pro projekty, kde je vyžadováno decentralizované řízení závislostí, plná kontrola nad integrací a minimální zásah do projektu Xcode. Většina nových projektů však volí Swift Package Manager (SPM) — je integrován v Xcode, nevyžaduje další instalaci a aktivně ho vyvíjí Apple. Carthage se doporučuje pro starší projekty, kde je již vybudována sestavovací linka, nebo pro knihovny, jejichž autoři chtějí dát uživatelům svobodu volby způsobu integrace.

Shrnutí

  • Carthage — decentralizovaný správce závislostí pro iOS, macOS, watchOS a tvOS, který sestavuje frameworky ze zdrojového kódu Git repozitářů
  • Cartfile — konfigurační soubor se syntaxí podporující GitHub repozitáře, libovolné Git URL a sémantické verzování
  • Instalace přes brew install carthage a sestavování závislostí přes carthage bootstrap nebo carthage update
  • Integrace s Xcode — ruční: frameworky se přidávají do General → Frameworks, Libraries, and Embedded Content s možností Embed & Sign
  • Cartfile.resolved fixuje přesné verze všech závislostí a zajišťuje reprodukovatelnost sestavení na CI a všech počítačích týmu
  • Typické problémy (mezipaměť, nekompatibilita Swift, CI chyby) se řeší vyčištěním mezipaměti, příznakem --no-use-binaries a konfigurací CI ukládání do mezipaměti
  • Výběr správce: Carthage — pro plnou kontrolu, CocoaPods — pro automatizaci, SPM — pro nové projekty s vestavěnou integrací

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také