iOS開發——Carthage:去中心化的Cocoa依賴管理器

若是說 CocoaPods 像一個航母, 包羅萬象, 堅實穩固. 那麼 Carthage 就像一艘巡洋艦, 機動靈活, 攻擊迅速. 1html

Why to use Carthage? 2

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

Carthage or CocoaPods? 3

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 的配置只能讓你看到一個庫的頭文件

Installing Carthage 開始使用:4

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 buildxcodebuild -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"

相關文章
相關標籤/搜索