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

上篇博客詳細的聊了CocoaPods的相關內容,今天咱們就來介紹另外一個Cocoa的包管理器Carthage。在上家公司用Swift開發工程時,用的就是Carthage。Carthage誕生於14年11月份,是用Swift語言開發的,相對於CocoaPods來講是一個新生事物。本篇博客主要介紹一下Carthage的使用姿式,接下來幾篇博客會介紹一下Carthage的源代碼,看一下其工做原理。本篇博客咱們會先介紹Carthage的按照和使用,而後再看一下Carthage額工做原理,而後再將本身的庫關聯到Carthage,最後來對比一下CocoaPods。html

首先咱們來看一下Carthage的官方介紹:Carthage的初衷是以最簡單的方式來爲你的Cocoa應用添加framework。Carthage將你依賴的三方庫編譯成二進制的framework,而後再提供給你使用。可是對你的工程結構有着完整的控制權。Carthage不會自動的修改你的工程文件或者編譯設置。git

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.github

 

 

1、Carthage的安裝和使用xcode

一、Carthage的安裝app

Carthage的安裝是比較簡單的,經過brew就能夠直接安裝,命令以下:框架

brew install carthageide

  

 

 

二、Carthage的使用-carthage update工具

 Carthage中管理依賴的文件爲Carfile,咱們能夠建立一個名爲Cartfile的文件來容納咱們工程中所依賴的三方庫。以下所示下方的Cartfile中依賴了一個AFNetWorking庫和一個並無支持Carthage的私有庫。在Cartfile文件中,咱們以github來直接指定該庫在github上的域名path。添加完Cartfile文件後,接下來咱們經過下方的命令進行安裝便可。網站

carthage updateui

在執行上述命令時咱們看到,對於「MyCocoaPodsTestProject」這個依賴倉庫提示「該倉庫沒有被分享的framework schemes」, 稍後咱們將會對「MyCocoaPodsTestProject」這個倉庫添加shared framerwork schemes。

  

 

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

  

 

三、工程中引入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中添加或者拖入生成的三方庫便可。 

  

 

  

 

 拖入完畢後,接下來咱們就能夠直接使用了。

  

 

 

2、本身的倉庫關聯Carthage

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

 

一、建立 framework project

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

  

 

二、引入源代碼

而後在這個framework工程中引入相關的源文件。

  

 

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

  

 在相關的.h文件中引入該framework所提供的相關頭文件,此處相似pch文件的設置。

  

 

若是你建立的framework的Project的名字與你預期的不一樣,能夠在Build Settings中的Product Name中進行設置,以下所示: 

  

 

二、shared schemes

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

  

  

 而後在Shared後方打鉤便可。

  

 

三、framework的編譯

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

carthage build -no-skip-current

  

 

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

  

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

   

 

使用xcodebuild編譯後,咱們又使用carhage build --no-skip-current試了一次,能夠正常編譯

  

 

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

  

 

而後咱們就能夠在Carthage中正常使用咱們的庫了。

   

 

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

   

 

 

 

3、carthage編譯

由於Carthage工程是Swift編寫的,而且是使用Carthage進行的依賴管理。 咱們能夠從github上Clone相關的代碼,而後執行carthage update進行依賴庫的加載,以下所示:

  

 

加載完畢後,咱們就能夠正常編譯運行了,下篇博客會介紹Chathage的相關源代碼的設計結構。

  

 

 

 

4、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將永遠不會有,由於這樣會以增長工具的複雜度爲代價。

 

 

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

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

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

  

 

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

  

 

下方就是咱們pod install後相關的內容,能夠看到依賴的倉庫經過了framework的形式被引入到了咱們的CocoaPods中,而且能夠正常使用。

  

 

咱們能夠經過指定SOURCE條件來切換源碼加載。

  

 

下方是切換源碼加載後的工程文件,能夠看出是與以前一致的:

  

 

今天的博客就先到這兒吧,之後有機會的話再一塊兒看一下Carthage的源碼。

相關文章
相關標籤/搜索