1. 程式人生 > >Cocoa包管理器之Carthage詳解及CocoaPods中心化+Carthage的二進位制化

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

上篇部落格詳細的聊了的相關內容,今天我們就來介紹另一個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

  

2、Carthage的使用-carthage update

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

carthage update

在執行上述命令時我們看到,對於“MyCocoaPodsTestProject”這個依賴倉庫提示“該倉庫沒有被分享的framework schemes”, 稍後我們將會對“MyCocoaPodsTestProject”這個倉庫新增shared framerwork schemes。

  

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

  

3、工程中引入framework

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

  

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

  

在Shell下方配置上carthage的命令路徑以及相關的執行命令的引數,如下所示:

/usr/local/bin/carthage copy-frameworks

  

配置完相關的執行指令碼後,在Link Binary With Libraries中新增或者拖入生成的三方庫即可。 

  

  

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

  

二、自己的倉庫關聯Carthage

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

1、建立 framework project

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

  

2、引入原始碼

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

  

在引入相關的原始檔後,在Build Phasea中的Header中的Public中新增對外暴露的標頭檔案,如下所示:

  

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

  

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

  

2、shared schemes

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

  

 然後在Shared後方打鉤即可。

  

3、framework的編譯

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

carthage build -no-skip-current

  

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

  

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

   

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

  

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

  

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

   

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

   

三、carthage編譯

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

  

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

  

四、Carthage VS CocoaPods

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

  

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

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。

  

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

  

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

  

我們可以通過指定SOURCE條件來切換原始碼載入。

  

下方是切換原始碼載入後的工程檔案,可以看出是與之前一致的:

  

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