天天看點

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

上篇部落格詳細的聊了CocoaPods的相關内容,今天我們就來介紹另一個Cocoa的包管理器Carthage。在上家公司用Swift開發工程時,用的就是Carthage。Carthage誕生于14年11月份,是用Swift語言開發的,相對于CocoaPods來說是一個新生事物。本篇部落客要介紹一下Carthage的使用姿勢,接下來幾篇部落格會介紹一下Carthage的源代碼,看一下其工作原理。本篇部落格我們會先介紹Carthage的按照和使用,然後再看一下Carthage額工作原理,然後再将自己的庫關聯到Carthage,最後來對比一下CocoaPods。

首先我們來看一下Carthage的官方介紹:Carthage的初衷是以最簡單的方式來為你的Cocoa應用添加framework。Carthage将你依賴的三方庫編譯成二進制的framework,然後再提供給你使用。但是對你的工程結構有着完整的控制權。Carthage不會自動的修改你的工程檔案或者編譯設定。

Carthage is intended to be the simplest way to add frameworks to your Cocoa application.Carthage builds your dependencies and provides you with binary frameworks, but you retain full control over your project structure and setup. Carthage does not automatically modify your project files or your build settings.

一、Carthage的安裝和使用

1、Carthage的安裝

Carthage的安裝是比較簡單的,通過brew就可以直接安裝,指令如下:

brew install carthage

  

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

2、Carthage的使用-carthage update

 Carthage中管理依賴的檔案為Carfile,我們可以建立一個名為Cartfile的檔案來容納我們工程中所依賴的三方庫。如下所示下方的Cartfile中依賴了一個AFNetWorking庫和一個并沒有支援Carthage的私有庫。在Cartfile檔案中,我們以github來直接指定該庫在github上的域名path。添加完Cartfile檔案後,接下來我們通過下方的指令進行安裝即可。

carthage update

在執行上述指令時我們看到,對于“MyCocoaPodsTestProject”這個依賴倉庫提示“該倉庫沒有被分享的framework schemes”, 稍後我們将會對“MyCocoaPodsTestProject”這個倉庫添加shared framerwork schemes。

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

執行完carthage update指令後,會生成一個Cartfile.resoved的檔案和一個Carthage的檔案夾。這個.resolved的檔案與CocoaPods中的lock檔案功能一緻,都是用來鎖版本的。而這個Carthage檔案夾下存放的就是Carthage為我們提供的動态庫framework。 

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

3、工程中引入framework

接下來要做的就是把Carthage生成的相應依賴庫的framework引入到我們的工程中。首先找到我們工程對應的Targets, 然後找到Build Phases下方的 ➕号下方的New Run Script Phase, 來添加引入framework的相關腳本。

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

下方是剛剛添加的Run Script,稍後會進行配置。

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

在Shell下方配置上carthage的指令路徑以及相關的運作指令的參數,如下所示:

/usr/local/bin/carthage copy-frameworks
Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

配置完相關的運作腳本後,在Link Binary With Libraries中添加或者拖入生成的三方庫即可。 

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化
Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

 拖入完畢後,接下來我們就可以直接使用了。

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

二、自己的倉庫關聯Carthage

從上面Carthage update時提示的錯誤我們不難發現要想支援Carthage, 我們的git倉庫中必須有一個可以生成framework的Project,并且該Project開啟了Scheme的分享功能。接下來我們就讓上述的 MyCocoaPodsTestProject工程支援Carthage的update。

1、建立 framework project

首先在我們工程所對應的github目錄下方建立一個Cocoa Touche Framework的工程。如下所示:

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

2、引入源代碼

然後在這個framework工程中引入相關的源檔案。

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

在引入相關的源檔案後,在Build Phasea中的Header中的Public中添加對外暴露的頭檔案,如下所示:

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

 在相關的.h檔案中引入該framework所提供的相關頭檔案,此處類似pch檔案的設定。

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

如果你建立的framework的Project的名字與你預期的不同,可以在Build Settings中的Product Name中進行設定,如下所示: 

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

2、shared schemes

接下來就該設定Scheme的Share了,首先打開Manager Schemes…如下所示:

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

  

 然後在Shared後方打鈎即可。

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

3、framework的編譯

使用終端進入到該工程目錄中,使用carthage進行編譯:

carthage build -no-skip-current
Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

在我編譯的時候遇到了上述的錯誤,不過Carthage的github首頁給出了相關的解決方案,即使用xcodebuild進行編譯,如下所示:

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

 使用上述指令編譯 結果如下所示:

   

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

使用xcodebuild編譯後,我們又使用carhage build --no-skip-current試了一次,可以正常編譯

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

進行編譯後,建立相關的tag然後push到遠端即可。 

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

然後我們就可以在Carthage中正常使用我們的庫了。

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

在引用相關庫的時候需要添加上其庫名,如下所示:

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

三、carthage編譯

因為Carthage工程是Swift編寫的,并且是使用Carthage進行的依賴管理。 我們可以從github上Clone相關的代碼,然後執行carthage update進行依賴庫的加載,如下所示:

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

加載完畢後,我們就可以正常編譯運作了,下篇部落格會介紹Chathage的相關源代碼的設計結構。

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

四、Carthage VS CocoaPods

兩者各有各的好處,也各有各的缺點,下方是Carthage的README中給出的與CocoaPods的不同之處。

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

下邊是根據上面的英文自己翻譯了一下:

CocoaPods是一個長期在Cocoa項目中使用的包管理工具,但為什麼還要去建立一個Carthage呢? 首先,CocoaPods預設是會為你的工程自動建立和更新一個Xcode工作空間,并且還會建立和更新所有的依賴(備注:安裝pod後會建立一個xxxxxx.xcworkspec的檔案,通過該檔案可以打開Xcode工作空間,該工作空間除了你自己的project外,在Pods中還會引入其依賴的三方庫的源代碼)。而Carthage與其不同,其會使用xcodebuild工具将依賴的庫編譯成二進制的framework, 但是整合這個framework的責任就落到了使用者的身上。浸入式的CocoaPods使用起來會更為容易一些,而非浸入式的Carthage使用起來則更為靈活。 下方是CocoaPods的README中列舉的目标之一: 通過建立更集中的生态系統,提高第三方開源庫的可發現性和參與度。 相比之下,Chathages是分散式依賴管理器。沒有集中的依賴清單(就是内個CocoaPods中的SPEC倉庫),這減少了維護工作,避免了任何中心故障點。然而,開源項目的發現變得更加困難,使用者必須在github等開源網站上進行自行搜尋。 CocoaPods的工程目錄中必須有一個叫做podspec的這麼一個檔案,其中包含有關項目的中繼資料并指定了工程的的編譯方式。Carthage使用了xcodebuild工具來建構依賴關系,而不是将這些依賴內建到單個工作區域中。它沒有類似podspec這樣的檔案,但你的依賴項必須包括它們自己的XCODE項目,在這些項目中提供了依賴庫的編譯規則。 最終,我們建立了Carthage,因為我們想要最簡單的工具——該依賴性管理器,它在不承擔Xcode所做的工作的的情況下完成自己依賴管理的工作,并且不為架構作者建立額外的工作。雖然CocoaPods提供了許多令人驚喜的特性,但Carthage将永遠不會有,因為這樣會以增加工具的複雜度為代價。

五、CocoaPods結合Cathage進行二進制化。

不過我們可以将兩者結合起來,比如一個浩大的工程中引入了成百上千個依賴庫,如果都以源碼的形式加載的話,編譯成本難免會比較大。我們可以在CocoaPods中加載Carthage生成的framework, 來達到CocoaPods的二進制化的目的。

我們可以在CocoaPods的Podfile中添加相關的定義,具體如下所示。在else的語句塊中就是加載Carthage編譯的framework。

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

添加完相關Pod配置後,我們可以pod install看醫生相關的庫是否順利的加載進來了。

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

下方就是我們pod install後相關的内容,可以看到依賴的倉庫通過了framework的形式被引入到了我們的CocoaPods中,并且可以正常使用。

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

我們可以通過指定SOURCE條件來切換源碼加載。

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

下方是切換源碼加載後的工程檔案,可以看出是與之前一緻的:

Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進制化

今天的部落格就先到這兒吧,以後有機會的話再一起看一下Carthage的源碼。

作者:青玉伏案

出處:http://www.cnblogs.com/ludashi/

本文版權歸作者和共部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

如果文中有什麼錯誤,歡迎指出。以免更多的人被誤導。

收履歷:某網際網路公司,招聘iOS/Android靠譜工程師,入職後,可内部聯系樓主,有小禮品贈送,有意者可郵箱投遞履歷:[email protected]