Carthage 去中心化的Cocoa依賴管理器

2022-08-05 14:00:14 字數 3078 閱讀 3820

carthage的目標是用最簡單的方式來管理cocoa第三方框架。

基本的工作流如下:

建立一個cartfile,包含你希望在專案中使用的框架的列表

執行carthage,將會獲取列出的框架並編譯它們

將編譯完成的.framework二進位制檔案拖拽到你的xcode專案當中

carthage編譯你的依賴,並提供框架的二進位制檔案,但你仍然保留對專案的結構和設定的完整控制。carthage不會自動的修改你的專案檔案或編譯設定。

cocoapods是已存在很長時間的cocoa依賴管理器,那麼為什麼要建立carthage呢?

首先,cocoapods預設會自動建立並更新你的應用程式和所有依賴的xcode workspace。carthage使用xcodebuild來編譯框架的二進位制檔案,但如何整合它們將交由使用者自己判斷。cocoapods的方法更易於使用,但carthage更靈活並且是非侵入性的。

cocoapods的目標在它的readme檔案描述如下:

…為提高第三方開源庫的可見性和參與度,建立一個更中心化的生態系統。

與之對照,carthage建立的是去中心化的依賴管理器。它沒有總專案的列表,這能夠減少維護工作並且避免任何中心化帶來的問題(如**伺服器宕機)。不過,這樣也有一些缺點,就是專案的發現將更困難,使用者將依賴於github的趨勢頁面或者類似的**庫來尋找專案。

cocoapods專案同時還必須包含一個podspec檔案,裡面是專案的一些後設資料,以及確定專案的編譯方式。carthage使用xcodebuild來編譯依賴,而不是將他們整合進一個workspace,因此無需類似的設定檔案。不過依賴需要包含自己的xcode工程檔案來描述如何編譯。

最後,我們建立carthage的原因是想要一種儘可能簡單的工具——一個只關心本職工作的依賴管理器,而不是取代部分xcode的功能,或者需要 讓框架作者做一些額外的工作。cocoapods提供的一些特性很棒,但由於附加的複雜性,它們將不會被包含在carthage當中。

carthage提供os x平臺的pkg安裝檔案,你可以從github的最新release中找到,按照引導一步步安裝即可。

如果你想安裝最新的開發版本(可能存在穩定性和相容性的問題),你只需要clone本倉庫的master分支,然後執行make install.

安裝完carthage後,你能夠使用它來新增框架到你的專案。注意carthage只支援動態框架,而後者只存在於ios 8以上(以及任意版本的os x)。

開始使用:

建立一個cartfile,將你想要使用的框架列在裡面

執行carthage update,將獲取依賴檔案到一個carthage.checkout資料夾,然後編譯每個依賴

在你的應用程式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只正式支援動態框架,動態框架能夠在任何版本的os x上使用,但只能在ios 8及以上版本使用。

因為carthage擁有非中心化的包列表,以及沒有專案指定的編譯設定,大多數框架應該能自動編譯。

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(將其中的大寫單詞換成你專案的對應名稱),然後觀察是否有相同的失敗發生,這應該能生成足夠的失敗資訊來解決問題。

carthage使用語義化標籤來發布穩定版本。如1.2.0,如帶有字母則是不受支援的版本(如1.2-alpha-1).

大多數carthage命令列工具的功能都封裝在一個名為carthagekit的框架中。

如果你希望將carthage作為另一個工具的一部分,或者希望擴充套件carthage的功能,可以看看carthagekit的原始碼,檢查api是否符合你的需求。

carthage使用mit開源協議授權釋出。