什么是Carthage
Carthage和CocoaPods都是用來管理第三方庫,與CocoaPods相比Carthage更加輕量一些,它是由Swift編寫的,所以在純Swift項目中更為便利
A simple, decentralized dependency manager for Cocoa
一個簡單、松散的依賴管理者
這個是Carthage Github上的描述
簡單對比Carthage與Cocoapods
- Carthage用xcodebuild 構(gòu)建框架(framework)的二進制文件,但是并沒有將他們整合到用戶項目中。Cocoapods的目的是讓用戶使用起來更簡單,而 Carthage 則是更靈活,減少對項目的侵入性
- Cocoapods項目還必須具有所謂的podspec文件,其中包括有關(guān)項目的元數(shù)據(jù),并指定應如何構(gòu)建它。Carthage使用xcodebuild去構(gòu)建依賴,而不是將它們集成到單個工作區(qū)中,它沒有類似的規(guī)范文件,但你的依賴項必須包含到自己的 Xcode 項目中,該項目描述了如何構(gòu)建其產(chǎn)品
安裝Carthage
- 安裝Homebrew
- 如果你已經(jīng)安裝了可以跳過這一步
- 更新最新版本
- 如果你沒有安裝,可以參考這里Mac 安裝homebrew并更新到最新版本
brew update
如果遇到
Error: The /usr/local directory is not writable.錯誤,就執(zhí)行以下命令sudo chown -R $(whoami):admin /usr/local再更新
- 安裝Carthage
brew install carthage
- 查看Carthage版本
carthage version
在項目中使用Carthage
- 進入項目所在文件夾
- 創(chuàng)建Cartfile文件
- 打開Cartfile文件
- 編輯Cartfile文件,添加依賴庫
cd 項目文件夾路徑
touch Cartfile
open Cartfile
github "Alamofire/Alamofire" == 4.5
git "https://enterprise.local/desktop/git-error-translations2.git"
binary "/absolute/path/MyFramework.json"
Cartfile文件
- 格式
- 使用 github 關(guān)鍵字指定 GitHub 存儲庫(GitHub.com 和 GitHub Enterprise)
- 其他 git 存儲庫使用 git 關(guān)鍵字指定
- 僅作為已編譯的二進制文件
.frameworks提供的依賴項使用binary關(guān)鍵字和https://鏈接,file://鏈接,或沒有方案的相對或絕對路徑,返回二進制項目規(guī)范
- 版本要求
-
>= 1.0指“1.0 及以上版本”。 -
~> 1.0指“1.x 版本” -
== 1.0指“版本為 1.0” -
"some-branch-or-tag-or-commit"特指 git 對象(git rev-parse 任何內(nèi)容都被允許)。
Note:二進制源 不支持這種形式。
如果沒有指定任何版本,任何版本的依賴都將被允許(默認使用最新版本)。
-
- 保存關(guān)閉Cartfile,運行Carthage
carthage update --platform iOS
運行命令后,一個叫Cartfile.resolved的文件將會被創(chuàng)建到 Cartfile 同級目錄下。此文件準確指定了每個依賴項選擇的版本,并列出了所有依賴項(甚至是嵌套的版本)。


強烈建議將該文件加入到版本控制中,告知其他開發(fā)者,當前使用的版本。
雖然 Cartfile.resolved 文件是人類可讀和可擴展的,但你不能修改它。文件的格式非常嚴格,列出依賴項的順序?qū)τ跇?gòu)建過程很重要。
Carthage 文件夾
- Build
包含對應平臺編譯好的Framework - Checkouts
包含編譯framework所使用的源代碼(除非你使用 submodules ,否則不要修改這里的代碼,carthage update和carthage checkout會覆蓋這里的代碼,清除你的修改)。
在"Carthage/Build/iOS"文件夾中會生成 .framework 文件。

在項目中使用Carthage
- 在Carthage -> Build中找到需要的framework
- 將framework拖拽到Xcode 工程的
Linked Frameworks and Libraries中 - 進入工程的 target -> Build Phases,點擊 +,添加
New Run Script Phase輸入一下腳本
/usr/local/bin/carthage copy-frameworks
在 Input Files 下添加要使用的框架的路徑
$(SRCROOT)/Carthage/Build/iOS/XXXX.framework
將復制框架的路徑添加到 Output Files
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/XXX.framework
- 為什么需要指定 Output Files
使用 Carthage 來管理第三方庫,在編譯并運行 App 的時候,會有一個階段叫:Carthage Copy Frameworks。這個階段通過跑一個腳本的形式把所有依賴的第三方庫都復制到 App 的目錄里。
這個階段通常會花 1~x 秒不等,這取決于你的 App 依賴的第三方庫數(shù)量。默認情況下,每次你 Build & Run 的時候,都會進行一次這個操作——盡管你的第三方庫沒有任何改變。
所以我們需要指定 Output Files,在 Output Files 指定輸出文件的情況下,Xcode 只會在 framework 發(fā)生更改時去進行 copy framework 操作,這樣就節(jié)省了時間。
更新庫
1、在carthage文件里面把有指定版本的庫更新到想要的版本,如無指定版本可忽略
2、調(diào)用命令更新庫
- 全部更新
carthage update --platform iOS
- 更新制定庫
carthage update XXX --platform iOS
最后的話
雖然說Carthage是純Swift編寫,但個人感覺還是覺得CocoaPods更加便利快捷,特別是在國內(nèi)。
在實際項目中Carthage升級或加庫經(jīng)常各種報錯,有可能是本人學藝未精,經(jīng)過萬般折騰,本人還是會首選CocoaPods作為第三方庫管理工具
參考文章
Carthage 新手教程
版權(quán)所有,如需轉(zhuǎn)載請聯(lián)系作者并注明出處