Carthage, Cocoa projeleri (iOS, macOS, watchOS, tvOS) için kaynak kodundan ikili framework'ler oluşturan merkezi olmayan bir bağımlılık yöneticisidir. CocoaPods'un aksine, Carthage projeyi otomatik olarak değiştirmez — geliştirici oluşturulan framework'leri manuel olarak Xcode'a ekler. Carthage Swift ile yazılmıştır, bağımlılıkları tanımlamak için Cartfile kullanır ve paralel derlemeyi destekler. GitHub deposuna göre, Carthage 15.000'den fazla yıldız toplamıştır ve Xcode yapılandırmasına minimum müdahale gerektiren projeler için niş ama aranan bir araç olmaya devam etmektedir.
Önemli Noktalar
carthage bootstrap veya carthage update ile yapılır — Carthage depoları klonlar ve bunları .xcframework olarak derlerCarthage, 2014 yılında Swift topluluğundan geliştiriciler tarafından oluşturulan merkezi olmayan mimariye sahip bir bağımlılık yöneticisidir. Carthage merkezi bir spesifikasyon kaydı kullanmaz — her kütüphane URL veya GitHub adı aracılığıyla doğrudan bir Git deposundan bağlanır. Carthage kaynak kodunu indirir, onu ikili bir framework'e (.xcframework veya .framework) dönüştürür ve geliştiriciye bir Xcode projesine manuel entegrasyon için hazır bir yapıt sağlar.
Carthage'ın mimarisi üç bileşen içerir: CLI aracı carthage, yapılandırma dosyası Cartfile ve oluşturulan framework'lerin bulunduğu Carthage/Build/ dizini. Carthage ve CocoaPods arasındaki temel fark, .xcodeproj'nin otomatik olarak değiştirilmemesidir. Carthage .xcworkspace oluşturmaz, derleyici flag'lerini yapılandırmaz ve Pods.xcconfig oluşturmaz. Geliştirici, Xcode aracılığıyla projeye manuel olarak framework'leri ekler ve entegrasyon süreci üzerinde tam kontrol sağlar.
Carthage, çok çekirdekli işlemcilerde süreci önemli ölçüde hızlandıran paralel bağımlılık derlemesi kullanır. Her bağımlılık ayrı bir hedef olarak oluşturulur ve Carthage geçişli bağımlılıkların grafiğini otomatik olarak çözerek bunları doğru sırayla oluşturur. Topluluk kıyaslamalarına göre Carthage, modern Mac'lerde ortalama 30–60 saniyede 15–20 bağımlılık oluşturur ve bu, çok sayıda kütüphane içeren projeler için CocoaPods'tan daha hızlıdır. Carthage tüm Apple platformlarını destekler: iOS, macOS, watchOS ve tvOS ve sürüm 0.38+'dan itibaren — simülatör ve Apple Silicon cihaz desteği için evrensel .xcframework oluşturur.
Carthage her bağımlılığın Git deposunu klonlar, belirtilen sürüme (etiket, commit veya dal) geçer ve framework'ü oluşturmak için xcodebuild'i çalıştırır. Carthage, derleme şemasına göre Xcode proje türünü (framework, dynamic framework, statik kütüphane) otomatik olarak belirler. Bir projenin birden fazla şeması varsa, Carthage varsayılan şemayı (alfabetik sırada ilk) kullanır. Derlemeden sonra Carthage, bitmiş framework'ü Carthage/Build/ dizinine kopyalar ve tam sürüm sabitlemesiyle Cartfile.resolved dosyası oluşturur. Carthage, oluşturulan framework'lerin önbelleğe alınmasını destekler — bağımlılıklarda değişiklik olmadan yeniden derleme atlanır.
Carthage'da geçişli bağımlılıklar Cartfile.resolved aracılığıyla yönetilir: Carthage gerekli tüm bağımlılıkların bir grafiğini oluşturur ve bunları doğru sırayla oluşturur. İki kütüphane aynı üçüncü taraf kütüphanesine bağımlıysa, Carthage onu bir kez oluşturur ve her ikisi için de kullanır. Carthage, belirli hedefi ve nedeni belirten derleme hatalarını raporlar — bu, sorun teşhisini basitleştirir.
Cartfile, bir Carthage projesinin bağımlılıklarını tanımlayan Ruby benzeri sözdizimine (Cartfile formatı) sahip bir yapılandırma dosyasıdır. Cartfile, proje kökünde .xcodeproj'nin yanında bulunur. Cartfile'ın her satırı bir bağımlılığı tanımlar: kaynak (Git URL'si, GitHub deposu) ve sürüm. Sözdizimi, etiketler, commit'ler ve dallar aracılığıyla sürüm sabitlemeyi destekler.
# Temel bağımlılıklar Carthage
github "Alamofire/Alamofire" ~> 5.9
github "SnapKit/SnapKit" ~> 5.7
github "onevcat/Kingfisher" == 8.0.0github "Owner/Repo" yönergesi, GitHub depoları için bir kısaltmadır. Carthage otomatik olarak https://github.com/Owner/Repo.git URL'sini oluşturur. GitLab, Bitbucket ve diğer Git sunucuları için tam URL kullanılır: git "https://gitlab.com/owner/repo.git". Sürüm operatörleri: ~> 5.9 (5.9'dan 6.0'a kadar herhangi bir sürüm, 6.0 hariç), == 8.0.0 (tam sürüm), >= 1.0 (minimum sürüm). Belirli bir commit, github "owner/repo" "abc1234" ile sabitlenebilir.
Carthage farklı yapılandırmalar için birden çok dizini destekler: Cartfile (ana), Cartfile.private (yayınlanmayan dahili bağımlılıklar için) ve Cartfile.resolved (otomatik oluşturulur). Özel bağımlılıklar, test framework'leri gibi yalnızca geliştirme derlemelerinde kullanılan kütüphaneler için kullanışlıdır.
# Cartfile — ana bağımlılıklar
github "Alamofire/Alamofire" ~> 5.9
github "SwiftyJSON/SwiftyJSON" ~> 4.0
github "realm/realm-swift" ~> 10.0
# Tam URL için GitLab
git "https://gitlab.com/company/internal-lib.git" == 2.1.1
# Geliştirme dalı
github "marmelroy/PhoneNumberKit" "development"github ve git, Cartfile'daki iki kaynak türüdür. İlki yalnızca GitHub içindir ve otomatik olarak URL oluşturur. İkincisi, tam URL'ye sahip herhangi bir genel veya özel Git deposu içindir. Bir sürüm, etiket (== 2.1.1), anlamsal aralık (~> 5.9), dal adı ("development") veya commit hash'i ("a1b2c3d") olarak belirtilebilir. SemVer'i takip eden bağımlılıklar için anlamsal aralıklar (~>) önerilir — bu, güncellemeler sırasında yıkıcı değişikliklere karşı korur.
Cartfile.resolved, carthage update'den sonra otomatik olarak oluşturulur. Geçişli olanlar dahil tüm yüklü bağımlılıkların tam sürümlerini sabitler. Bu dosya Git'te saklanmalıdır — onsuz, başka bir makinede carthage bootstrap komutu aynı kurallarla kütüphaneleri oluşturacaktır, ancak sürümler farklılık gösterebilir. carthage outdated, yeni sürümleri mevcut olan güncel olmayan bağımlılıkların bir listesini gösterir.
Carthage, Homebrew (macOS için standart paket yöneticisi) aracılığıyla kurulur. Alternatif yöntemler: GitHub'dan oluşturulmuş bir .pkg yükleyiciden kurulum veya kaynaktan derleme. Carthage, Xcode with Command Line Tools (xcodebuild dahil) gerektirir ve Apple Silicon Mac'te bazı eski bağımlılıklar için Rosetta 2 gerekir.
# Kurulum Carthage aracılığıyla Homebrew
brew install carthage
# Sürüm kontrolü
carthage version
# .pkg üzerinden kurulum (eğer Homebrew mevcut değilse)
# İndir Carthage.pkg'yi GitHub Releases adresinden indirip manuel kurunCarthage'ı kurduktan sonra, proje başlatma işlemi proje kökünde bir Cartfile oluşturarak başlar. Carthage'ın init komutu yoktur — dosya bir metin düzenleyicide manuel olarak oluşturulur. Cartfile'ı bağımlılıklarla doldurduktan sonra, geliştirici carthage bootstrap (zaten Cartfile.resolved varsa) veya carthage update (ilk kurulum veya güncelleme) komutunu çalıştırır. Carthage depoları klonlar, framework'leri oluşturur ve bunları Carthage/Build/ dizinine yerleştirir.
Carthage'ı güncelleme brew upgrade carthage ile yapılır. Sürüm carthage version ile kontrol edilir. 2025 ortası itibarıyla en son kararlı sürüm, varsayılan .xcframework desteği, geliştirilmiş paralel derleme ve tam Swift 6 desteği ile 0.40'tır. Sürüm 0.39'dan itibaren Carthage, uyumluluk shim'i olmadan eski .framework oluşturmayı durdurmuştur — açıkça --use-xcframeworks belirtilmesi önerilir.
# Güncelleme Carthage aracılığıyla Homebrew
brew upgrade carthage
# Belirli bir sürümü yükleme
brew install carthage@0.39
# Tamamen yeniden kurulum
brew uninstall carthage && brew install carthageNot: Carthage .xcworkspace oluşturmaz ve .xcodeproj'yi değiştirmez. CocoaPods'un aksine, Carthage Xcode yapılandırmasının tam kontrolünü geliştiriciye bırakır. Bu, bağımlılıkları kurduktan sonra framework'leri manuel olarak Xcode'a eklemeniz gerektiği anlamına gelir (bkz. «Carthage framework'lerini Xcode'a entegre etme» bölümü). Carthage ayrıca her bağımlılığın bir framework hedefi içeren bir Xcode projesi veya çalışma alanı içermesini gerektirir — aksi takdirde derleme başarısız olur.
Carthage, bağımlılıklarla çalışmak için üç ana komut sunar: bootstrap, update ve build. carthage bootstrap, mevcut bir Cartfile.resolved dosyasından bağımlılıkları oluşturur — CI ortamları ve projeye katılan geliştiriciler için önerilir. carthage update, Cartfile.resolved dosyasını en son sürümlere (Cartfile kısıtlamalarına saygı göstererek) günceller ve derlemeyi gerçekleştirir. carthage build, sürümleri kaydetmeden belirtilen tüm bağımlılıkları oluşturur.
# İlk kurulum (sürümleri günceller)
carthage update --use-xcframeworks --platform iOS
# Sabitlenmiş sürümlerle yeniden derleme
carthage bootstrap --use-xcframeworks --platform iOS
# Yalnızca bir bağımlılık oluştur
carthage build Alamofire --platform iOS--use-xcframeworks flag'i, Carthage'a eski .framework yerine evrensel .xcframework oluşturmasını söyler. Bu, hem simülatör hem de gerçek bir cihaz için ve ayrıca ek komut dosyası olmadan Apple Silicon Mac'ler için destek sağlar. --platform iOS flag'i, derlemeyi tek bir iOS platformuyla sınırlar — bu, özellikle proje platformlar arası kütüphaneler içeriyorsa süreci önemli ölçüde hızlandırır.
Carthage, zaten oluşturulmuş framework'leri önbelleğe alan --cache-builds flag'i aracılığıyla paralel derlemeyi destekler. Yeniden derleme sırasında Carthage, Git commit hash'ini kontrol eder ve kod değişmemişse derlemeyi atlar. CI sunucuları için Carthage/Build/ dizini ve ~/Library/Caches/carthage/ önbelleğe alınması önerilir. Carthage ayrıca ayrıntılı günlük kaydı için --verbose ve kaynaktan zorunlu derleme için --no-use-binaries (geliştirici önceden oluşturulmuş ikili dosyalara güvenmiyorsa) destekler.
| Komut | Eylem |
|---|---|
carthage update | Cartfile.resolved'ı günceller ve tüm framework'leri oluşturur |
carthage bootstrap | Güncellemeden mevcut Cartfile.resolved'dan framework'leri oluşturur |
carthage build | Sürümleri sabitlemeden belirtilen bağımlılıkları oluşturur |
carthage outdated | Güncellemesi olan bağımlılıkların listesini gösterir |
carthage checkout | Derleme yapmadan yalnızca depoları klonlar |
Entegrasyon Carthage framework'lerinin Xcode'a entegrasyonu dört adımda manuel olarak yapılır. carthage update veya bootstrap çalıştırıldıktan sonra, oluşturulan tüm framework'ler Carthage/Build/iOS/ (veya ilgili platform) içinde bulunur. Geliştirici Xcode projesini açar, uygulama hedefini seçer ve framework'leri General → Frameworks, Libraries, and Embedded Content'e ekler. Çalışma zamanı framework'leri (dinamik kütüphaneler) için «Embed & Sign» seçilmelidir — aksi takdirde uygulama başlatılırken «dyld: Library not loaded» hatasıyla çöker.
Carthage statik kütüphaneler için daha basittir — doğrudan uygulamanın yürütülebilir dosyasına bağlandıkları için gömme aşaması gerektirmezler. Ancak Carthage, varsayılan olarak dinamik framework'ler oluşturur (açıkça yapılandırılmış statik kütüphaneler hariç). Uygulama boyutunu en aza indirmenin önemli olduğu projeler için Xcode ayarları aracılığıyla statik bağlama önerilir.
Ek bir adım, Build Phase → Run Script'e Input Files eklemektir. Carthage, oluşturulan framework'ten simülatör yapıtlarını kaldırmak için bir komut dosyası gerektirir (strip simulator architectures). Bu komut dosyası App Store derlemeleri için gereklidir:
# Run Script için 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"
doneCarthage .xcworkspace kullanımını gerektirmez — tüm bağımlılıklar zaten ikili framework'lere dönüştürülmüştür. Carthage, bir çalışma alanı oluşturan CocoaPods'un aksine doğrudan .xcodeproj ile çalışır. Bu, Carthage bağımlılıkları Xcode proje yapılandırmasını değiştirmediği için sürüm kontrolünü ve CI kurulumunu basitleştirir. Tek değişiklik, hedefe framework eklemektir ve bu .pbxproj dosyasına kaydedilir.
| Adım | Eylem |
|---|---|
| 1 | carthage update --use-xcframeworks çalıştırın |
| 2 | Framework'leri Carthage/Build/ dizininden General → Frameworks'e sürükleyin |
| 3 | Dinamik framework'ler için Embed & Sign'ı ayarlayın |
| 4 | Simülatör mimarilerini kaldırmak için Run Script Phase ekleyin |
| 5 | Projeyi derleyin — framework'ler otomatik olarak bağlanmalıdır |
Carthage, CocoaPods ve Swift Package Manager (SPM), iOS geliştirmedeki üç ana bağımlılık yöneticisidir. Carthage merkezi olmayan yaklaşımıyla öne çıkar, CocoaPods merkezi bir kayıt sunar ve SPM, Apple'ın entegre çözümüdür. Bunlar arasındaki seçim, proje gereksinimlerine, ekip büyüklüğüne ve istenen otomasyon düzeyine bağlıdır.
| Kriter | Carthage | CocoaPods | SPM |
|---|---|---|---|
| Mimari | Merkezi olmayan | Merkezi kayıt | Xcode'a entegre |
| Yapılandırma dili | Cartfile (Ruby benzeri) | Podfile (Ruby DSL) | Package.swift (Swift) |
| Xcode entegrasyonu | Manuel (sürükle ve bırak) | Çalışma alanı aracılığıyla | Entegre |
| Geçişli bağımlılıklar | Otomatik | Otomatik | Otomatik |
| Kütüphane kaydı | Yok (Git depoları) | Specs'te 100.000+ | ~65.000 |
| Kaynak desteği | Hayır | Evet (kaynak paketleri) | Evet (Resources) |
| Derleme hızı | Hızlı (paralel) | Orta | Hızlı |
| Entegrasyon kontrolü | Tam | Otomatik | Otomatik |
Carthage, Xcode yapılandırmasına minimum müdahale ve entegrasyon süreci üzerinde tam kontrol gerektiren projeler için seçilir. Carthage, yazarın kullanıcıların bağımlılıkları bağımsız olarak oluşturmasına izin vermek istediği açık kaynak kütüphaneler ve framework'ler için idealdir. Carthage ayrıca UNIX felsefesine değer veren geliştiriciler arasında da popülerdir: her araç bir işi iyi yapar. CocoaPods, otomasyonun önemli olduğu düzinelerce bağımlılığa sahip kurumsal projeler için standart olmaya devam etmektedir. SPM, Xcode'a entegre olduğu ve Apple tarafından aktif olarak geliştirildiği için yeni projeler için tercih edilir.
Geçiş yöneticiler arasında farklı yaklaşımlar gerektirir. Carthage → SPM: framework'leri Xcode'dan kaldırın, Cartfile'ı silin ve File → Add Package Dependencies aracılığıyla Package Dependencies ekleyin. Carthage → CocoaPods: Carthage framework'lerini kaldırın, bir Podfile oluşturun, bağımlılıkları ekleyin ve pod init && pod install komutunu çalıştırın. Carthage'dan CocoaPods veya SPM'ye geçiş yaparken, framework'leri manuel olarak güncelleme ihtiyacı ortadan kalkar — tüm bağımlılıklar tek bir komutla güncellenir. Carthage, satıcı kilitlemesinden kaçınmanın ve bağımlılık derlemesinin şeffaflığını korumanın önemli olduğu projeler için geçerliliğini korur.
Carthage istikrarlı bir araçtır, ancak geliştiriciler özellikle CI sunucularında derleme yaparken, Xcode'u güncellerken veya Swift sürümlerini değiştirirken periyodik olarak tipik sorunlarla karşılaşır. Çoğu sorun, önbelleği temizleyerek, --use-xcframeworks doğru yapılandırarak ve minimum iOS sürümünü kontrol ederek çözülür.
«The file manager returned an error» hatası — Carthage önbelleği bozulduğunda veya dosya izin çakışması olduğunda oluşur. Çözüm: rm -rf ~/Library/Caches/carthage ile önbelleği silin ve carthage bootstrap komutunu yeniden başlatın. Projedeki Carthage/ dizinini silmek ve yeniden derlemek de yardımcı olur. CI sunucularında, Carthage önbelleği yalnızca Cartfile.resolved değiştiğinde güncellenmelidir.
«No such module» hatası — Carthage derlemesi başarılı olmasına rağmen framework Xcode'da bulunamaz. Çözüm: General → Frameworks, Libraries, and Embedded Content içinde framework yolunu kontrol edin. Framework Carthage/Build/iOS/ içinde olmalıdır. .xcframework'ün doğru eklendiğinden emin olun (yeniden sürükleyin). Dinamik framework'ler için Embed & Sign'ı kontrol edin. Hata devam ederse, Build Settings'e FRAMEWORK_SEARCH_PATHS ekleyin.
Swift uyumsuzluğu nedeniyle derleme hatası — kütüphane, projeden farklı bir Swift sürümü için derlenmiştir. Çözüm: aynı Swift sürümüyle kaynaktan derlemeye zorlamak için carthage update --no-use-binaries kullanın. Kütüphane mevcut sürüm altında derlenmezse, Swift sürümünü belirtmek için .xcconfig kullanın veya kütüphaneyi fork edin. Carthage 0.39'dan itibaren, --use-xcframeworks otomatik olarak ikili dosyaya doğru Swift sürümünü ekler.
CI derleme sorunları — CI'da Carthage, uygun önbellek yapılandırması gerektirir. Çözüm: Carthage/Build/ ve ~/Library/Caches/carthage/ önbelleğe alın. Sürümleri değiştirmemek için CI'da güncelleme yerine carthage bootstrap --use-xcframeworks --platform iOS kullanın. GitHub Actions için resmi bir Carthage eylemi mevcuttur. Jenkins için — CarthageBuild eklentisi. Carthage, GUI olmayan macOS'ta çökebilir — çözüm: brew install xcode-build-server kurun veya -UseModernBuildSystem=NO flag'ini ekleyin.
| Sorun | Neden | Çözüm |
|---|---|---|
| File manager hatası | Bozuk önbellek | ~/Library/Caches/carthage/ temizleyin |
| No such module | Framework Xcode'a eklenmemiş | Hedefte Frameworks'ü kontrol edin |
| Swift uyumsuzluğu | Farklı Swift sürümleri | --no-use-binaries veya daha yeni Carthage sürümü |
| CI hatası | Önbellek veya GUI eksik | Carthage/Build/ önbelleğini yapılandırın |
| Kütüphane derlenmiyor | Kütüphane için Xcode projesi yok | Depo yapısını kontrol edin |
Sıkça Sorulan Sorular
Carthage, Apple platformları için merkezi olmayan bir bağımlılık yöneticisidir. CocoaPods'un aksine, Carthage merkezi bir kütüphane kaydı kullanmaz, Xcode projesini otomatik olarak değiştirmez ve .xcworkspace oluşturmaz. Carthage bağımlılıkları, geliştiricinin manuel olarak Xcode'a eklediği ikili framework'lere dönüştürür. CocoaPods ise tüm süreci Podfile aracılığıyla otomatikleştirir.
Carthage, Homebrew aracılığıyla kurulur: brew install carthage. Alternatif olarak — GitHub Releases'den Carthage.pkg indirin veya kaynaktan derleyin. Kurulumdan sonra sürümü kontrol edin: carthage version. Carthage, Xcode with Command Line Tools gerektirir. Apple Silicon Mac'te ek olarak Rosetta 2 gerekebilir.
Cartfile, geliştirici tarafından yazılan bir yapılandırma dosyasıdır: kütüphane adlarını ve sürüm operatörlerini (~> 5.9, == 8.0.0, dal adı) içerir. Cartfile.resolved, carthage update sırasında otomatik olarak oluşturulur ve yüklü tüm bağımlılıkların tam sürümlerini sabitler. Cartfile.resolved Git'te saklanmalıdır — tüm makinelerde derleme tekrarlanabilirliğini sağlar.
Carthage, kütüphanenin bir framework hedefi içeren geçerli bir Xcode projesi veya çalışma alanı içermesini gerektirir. Depoya erişilebilir olduğunu (anahtar olmadan özel olmadığını), doğru sürümün belirtildiğini (etiket veya commit mevcut) ve kütüphanenin Xcode sürümünüzü desteklediğini kontrol edin. Ayrıntılı teşhis için carthage build --verbose kullanın. Kütüphanenin bir framework hedefi yoksa, Carthage onu derleyemez.
Carthage, merkezi olmayan bağımlılık yönetimi, entegrasyon üzerinde tam kontrol ve Xcode projesine minimum müdahale gerektiren projeler için geçerliliğini korur. Ancak çoğu yeni proje Swift Package Manager (SPM) seçer — Xcode'a entegredir, ek kurulum gerektirmez ve Apple tarafından aktif olarak geliştirilir. Carthage, derleme hattının zaten kurulu olduğu eski projeler veya kullanıcılara entegrasyon yöntemini seçme özgürlüğü vermek isteyen kütüphane yazarları için önerilir.
Özet
brew install carthage ile yapılır ve bağımlılık derlemesi carthage bootstrap veya carthage update ile yapılır--no-use-binaries flag'i ve CI önbellek yapılandırmasıyla çözülürAnahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun