若是說 CocoaPods 像一個航母, 包羅萬象, 堅實穩固. 那麼 Carthage 就像一艘巡洋艦, 機動靈活, 攻擊迅速. 1html
CocoaPods是已存在很長時間的Cocoa依賴管理器, 那麼爲何要建立Carthage呢?
1) CoaoaPods 是一套總體解決方案,咱們在 Podfile 中指定好咱們須要的第三方庫。而後 CocoaPods 就會進行下載,集成,而後修改或者建立咱們項目的 workspace 文件,這一系列總體操做。
2) 相比之下,Carthage 就要輕量不少,它也會一個叫作 Cartfile 描述文件,但 Carthage 不會對咱們的項目結構進行任何修改,更很少建立 workspace。它只是根據咱們描述文件中配置的第三方庫,將他們下載到本地,而後用 xcodebuild 構建成 framework 文件。而後由咱們本身將這些庫集成到項目中。Carthage 使用的是一種非侵入性的哲學。git
Carthage 基本的工做流程:
1> 建立一個Cartfile,包含你但願在項目中使用的框架的列表
2> 運行Carthage,將會獲取列出的框架並編譯它們
3> 將編譯完成的.framework二進制文件拖拽到你的Xcode項目當中
Carthage編譯你的框架/庫,而後提供該框架的二進制文件,但你仍然持有該項目結構和設置的絕對控制。Carthage不會自動的修改你的項目文件或編譯設置。github
相信你們可能遇到這種狀況, Podfile中配置好相關框架/庫
-> pod install -verbose -no-repo-update
, 而後編譯運行時, 出現相似錯誤:bootstrap
diff: /../Podfile.lock: No such file or directory diff: /Manifest.lock: No such file or directory
接下來又是一系列的折騰, 白白浪費不少時間.swift
CocoaPods 有以下優點: xcode
① 使用方便, 除編寫 Podfile 之外其餘幾乎都是自動完成;
② 軟件包數量多,主流支持;
③ 支持 iOS 8 Framework,固然也支持舊的靜態編譯.服務器
可是 CocoaPods 做爲一個有中心倉庫的解決方案,缺點也比較明顯:app
1⃣️ 每次更新環境都須要鏈接到中心倉庫,比較耗時;
2⃣️ 開發者使用比較簡單,可是若是建立兼容 CocoaPods 的庫,就會相對繁瑣一些(儘管有了命令行);
3⃣️ 每次乾淨編譯都會把全部第三方庫都從新編譯一次框架
Carthage 的優點: 工具
① 使用 Carthage 的話,全部的第三方庫依賴,除非是更新的須要,否則日常
乾淨編譯 Project,它是不須要再次編譯
的,大大加快日常編譯及 Archive 的時間.
② 它是去中心化
的,沒有中心服務器. 這意味着每次配置和更新環境,只會去更新具體的庫,而不會有一個向中心服務器獲取最新庫的索引這麼個過程,如此又省了不少時間.
③ CocoaPods 無縫集成!一個項目可同時使用兩套包管理工具
, 當前 CocoaPods 管理主要 Framework 的配置下, 將少許其餘 Framework 交給了 Carthage 管理, 兩者能夠和諧地共存.
④ 結構標準的項目自然就是 Carthage 庫
.
Carthage 的不足:
1⃣️ 庫依然不如 CocoaPods 豐富:儘管不少庫不須要聲明並改造就直接能夠被 Carthage 用,但依然有大量 CocoaPods 能用的庫不支持,我相信時間能解決這個問題;
2⃣️只支持 Framework,因此是 iOS 8 Only
了,隨着時間推移,這個也不會是問題;
3⃣️ 工具仍不完善:在使用過程當中,發現它沒法在一個結構複雜的項目中正確發現庫(好比有 iOS, Mac demo + framework 的結構);
4⃣️ 沒法在 Xcode 裏定位到源碼:若是你在寫代碼過程當中,想跳轉到一個第三方庫去看具體的實現,這是沒法辦到的,Carthage 的配置只能讓你看到一個庫的頭文件
1. 建立一個"Cartfile",將你想要使用的框架列在裏面 2. 運行"carthage update",將獲取依賴文件到一個Carthage.checkout 文件夾,而後編譯每一個依賴 3. 在你的應用程序target的 'General' 設置標籤中的 'Embedded Binaries' 區域,將框架從"Carthage.build文件夾拖拽進去"。
在這個過程中,Carthage將建立一些build artifacts,其中最重要的是Cartfile.lock
文件,裏面將列出每一個框架的具體版本,確保你提交了這個文件到版本控制工具裏面(如Git、SVN),由於每一個用到項目的人都須要它來編譯相同版本的框架。
完成上面的步驟並提交你的修改,項目的其餘用戶就只須要獲取該倉庫並執行carthage bootstrap
就能使用你所添加的框架。
添加框架到單元測試或另外一個框架
使用Carthage添加框架到任意目標的方法,和添加到應用程序差很少。主要的不一樣在於框架是如何設置並連接到Xcode的。
由於非應用程序目標沒有「Embedded Binaries」設置區域,你須要將編譯完成後的框架拖拽到「Link Binaries With Libraries」的區域裏。
在某些稀有案例中,你也許會想要複製每一個依賴到已編譯的項目中(好比,在外部框架中嵌入依賴,或確保依賴在測試工具中正常顯示)。想要達到這個目的,你須要建立一個新的「Copy Files」編譯選項和「Frameworks」組,而後將框架的引用添加到裏面。
升級框架
若是你修改了Cartfile,或者你想升級到框架的最新版本(取決於你指定的需求版本),執行 carthage update
命令能夠達到目的。
讓你的框架支持Carthage
Carthage只正式支持動態框架,動態框架可以在任何版本的OS X上使用,但只能在iOS 8及以上版本使用。
由於Carthage擁有非中心化的包列表,以及沒有項目指定的編譯設置,大多數框架應該能自動編譯。
分享你的Xcode schemes
Carthage將只從你的.xcodeproj 中標記爲已分享的Xcode schemes來編譯。若是你想檢查編譯是否成功,執行carthage build --no-skip-current
命令,而後檢查Carthage.build文件夾。
若是當執行命令但有scheme沒有被編譯,打開Xcode並肯定對應scheme被標記爲「Shared」,以便Carthage可以發現它。
解決編譯失敗
若是你在執行carthage build --no-skip-current
時編譯失敗,嘗試執行xcodebuild -scheme SCHEME -workspace WORKSPACE build
或 xcodebuild -scheme SCHEME -project PROJECT build
(將其中的大寫單詞換成你項目的對應名稱),而後觀察是否有相同的失敗發生,這應該能生成足夠的失敗信息來解決問題。
[5]Carthage:Xcode項目的GitHub依賴管理器 -- http://www.infoq.com/cn/news/2015/05/carthage-dependency-manager
引用源🔽
1:http://swiftcafe.io/2015/10/25/swift-daily-carthage-package/) "SwiftCafe -- Carthage 包管理工具,另外一種敏捷輕快的 iOS & MAC 開發體驗"
2:http://swiftcafe.io/2015/10/25/swift-daily-carthage-package/) "SwiftCafe -- Carthage 包管理工具,另外一種敏捷輕快的 iOS & MAC 開發體驗"
3:https://imtx.me/archives/1939.html "TUALATRIX -- Carthage 初探:四大優點與四大劣勢"
4:https://github.com/Carthage/Carthage#adding-frameworks-to-an-application "GitHub.com"