CocoaPods 是開發(fā) OS X 和 iOS 應(yīng)用程序的一個第三方庫的依賴管理工具。利用 CocoaPods,可以定義自己的依賴關(guān)系庫 (稱作pods),并且隨著時間的變化,在整個開發(fā)環(huán)境中對第三方庫的版本管理非常方便。
1.為什么要用CocoaPods?
在iOS項(xiàng)目開發(fā)過程中,我們經(jīng)常會使用一些第三方庫,如AFNetworking、YYKit、Masonry等,通過這些優(yōu)秀的第三方庫,來幫助我們更有效率的進(jìn)行開發(fā)。回想一下我們導(dǎo)入這些第三方庫的過程:
第一步:下載第三方庫的源代碼并添加到工程;
第二步:添加第三方庫使用到的Framework;
第三步:處理第三方庫之間或第三方庫與工程之間的依賴關(guān)系以及重復(fù)添加等問題;
第四步:如果第三方庫有更新,需要將工程中使用的第三方庫刪除,重新執(zhí)行前面的三個步驟。
上面的四個步驟,如果我們使用CocoaPods,那么只需要配置好相應(yīng)的Podfile,CocoaPods會為我們?nèi)プ龊眠@些事情。
2.安裝CocoaPods
CocoaPods是用Ruby?的依賴管理 gem 進(jìn)行構(gòu)建的,要想使用它首先需要有Ruby的環(huán)境。OS X系統(tǒng)默認(rèn)可以運(yùn)行Ruby,因此執(zhí)行以下命令即可:
$ sudo gem install cocoapods
安裝完成后,執(zhí)行下面的指令,如果沒有報錯,則說明安裝成功。
$ pod setup
【說明】:如果執(zhí)行上面指令的時候,長時間沒有反應(yīng),這可能是因?yàn)镽uby的默認(rèn)源使用cocoapods.org,國內(nèi)訪問這個網(wǎng)址有時候會有問題,可以將該源替換成淘寶的(如果淘寶的有問題,可以用https://gems.ruby-china.org/),替換方式如下:
$ gem sources --remove https://rubygems.org/
$ gem sources -a http://ruby.taobao.org/
替換完成之后,執(zhí)行指令:
$ gem sources -l
如果輸出結(jié)果和下圖一樣,則表示替換成功。

3.升級CocoaPods
CocoaPods的升級很簡單,直接執(zhí)行安裝指令即可:
$ sudo gem install cocoapods
4.Podfile文件說明
Podfile是一個文件,用于定義項(xiàng)目所需要使用的第三方庫。該文件支持高度定制,詳細(xì)的信息可以參考Podfile 指南。下面列出常用的語法并進(jìn)行說明。
先看一個示例的Podfile文件:

source 'https://github.com/Artsy/Specs.git'
source 'https://github.com/CocoaPods/Specs.git'
platform:ios, '8.0'
inhibit_all_warnings!
target 'MVVMReactiveCocoa'dopod 'SDWebImage', '~> 3.7.1'
pod 'UIActivityIndicator-for-SDWebImage'
pod 'MBProgressHUD', '~> 0.9'
pod 'SSKeychain', '~> 1.2.2'
pod 'IQKeyboardManager', '~> 3.2.0.3'
pod 'SVPullToRefresh', '~> 0.4.1'
pod 'MKNetworkKit', '~> 0.87'
pod 'WebViewJavascriptBridge', '~> 4.1.4'
pod 'FormatterKit', '~> 1.8.0'
pod 'DZNEmptyDataSet', '~> 1.5.1'
pod 'Ono', '~> 1.2.0'
pod 'FMDB'
pod 'UMengSocial', '~> 4.3'
pod 'GPUImage', '~> 0.1.7'
pod 'Reveal-iOS-SDK', '~> 1.6.0'
pod 'Appirater'
pod 'SDVersion'
pod 'YYKit'
pod 'OcticonsIOS',:git=> 'https://github.com/jacksonh/OcticonsIOS.git',:commit=>'4bd3b21'
pod 'LCFInfiniteScrollView',:git=> 'https://github.com/leichunfeng/LCFInfiniteScrollView.git'
target 'MVVMReactiveCocoaTests'doinherit!:search_pathsendend

看到上面的Podfile文件,有些語句的含義,我們也能大概理解,下面細(xì)說一下:
序號語句說明
1source ?'URL'指定鏡像倉庫的源
2platform : iOS, ?'6.0'指定所支持系統(tǒng)和最低版本
3inhibit_all_warnings!屏蔽所有warning
4workspace '項(xiàng)目空間名'指定項(xiàng)目空間名
5xcodeproj '工程文件名'指定xcodeproj工程文件名
6pod ?'庫名'引入庫,什么版本都可以(一般是最新版本)
7pod ?'庫名', '版本'引入指定版本的庫
8pod '庫名', :podspec => 'podspec文件路徑'指定導(dǎo)入庫的podspec文件路徑
9pod '庫名', :Git?=> '源碼git地址'指定導(dǎo)入庫的源碼git地址
10pod '庫名', :tag => 'tag名'指定導(dǎo)入庫的Tag分支
關(guān)于引入庫的版本,除了指定和不指定之外,還有如下操作:
>0.1高于0.1的任何版本;
>=0.1版本0.1和任何更高版本;
<0.1低于0.1的任何版本;
<=0.1版本0.1和任何較低的版本;
?>0.1.2版本 0.1.2的版本到0.2 ,不包括0.2。這個基于你指定的版本號的最后一個部分。這個例子等效于>= 0.1.2并且 <0.2.0,并且始終是你指定范圍內(nèi)的最新版本。
【補(bǔ)充】:關(guān)于pod指令,除了常規(guī)的pod '庫名'方式,還有下面這些帶參數(shù)的方式:
1.使用本地路徑。
pod'AFNetworking', :path =>'~/Documents/AFNetworking'
使用path方式,執(zhí)行“pod install”,指令后,可以看到Pods下新加了一個目錄:

對比一下我們常規(guī)的pod方式:

2.使用主分支的版本,也就是默認(rèn)寫法。
pod'AFNetworking', :git =>'https://github.com/gowalla/AFNetworking.git'
3.不使用主分支,使用指定分支。
pod'AFNetworking', :git =>'https://github.com/gowalla/AFNetworking.git', :branch =>'dev'
4.使用指定的commit版本。
pod'AFNetworking', :git =>'https://github.com/gowalla/AFNetworking.git', :commit =>'082f8319af'
5.使用指定tag版本
pod'AFNetworking', :git =>'https://github.com/gowalla/AFNetworking.git', :tag =>'0.7.0'
5.使用CocoaPods
5.1創(chuàng)建一個演示項(xiàng)目
為了演示使用CocoaPods的過程,在這里創(chuàng)建了一個MVVMDemo的演示項(xiàng)目,創(chuàng)建項(xiàng)目的過程這里不細(xì)說了。
5.2創(chuàng)建Podfile文件
在終端進(jìn)入項(xiàng)目所在目錄,然后用如下指令創(chuàng)建Podfile文件:
$ touch Podfile
此時項(xiàng)目文件夾里會創(chuàng)建一個名為Podfile的文件,如下圖所示:

5.3編輯Podfile文件
使用XCode打開Podfile文件:
$ open -a Xcode Podfile
在這里,我們需要導(dǎo)入AFNetworking、YYKit、Masonry庫,因此在Podfile文件中輸入如下內(nèi)容:

source 'https://github.com/CocoaPods/Specs.git'
platform:ios, '8.0'inhibit_all_warnings!
target 'MVVMDemo' do pod 'AFNetworking' pod 'YYKit' pod 'Masonry'
end

5.4執(zhí)行導(dǎo)入命令
編寫完成Podfile文件之后,保存關(guān)閉,輸入如下指令導(dǎo)入第三方庫:
$ pod install
CocoaPods就會做如下工作:下載源碼、配置依賴關(guān)系、引入需要的framework等。命令的執(zhí)行結(jié)果如下所示:

Updating local specs repositories
CocoaPods1.1.0.beta.1 is available.To updateuse: `gem install cocoapods --pre`
[!] This is a test version we'd love you to try.Formore information see http://blog.cocoapods.org
and the CHANGELOGforthis version http://git.io/BaH8pQ.Analyzing dependencies
Downloading dependencies
Installing AFNetworking(3.1.0)Installing Masonry(1.0.1)Installing YYKit(1.0.7)Generating Pods projectIntegrating client project[!] Please close any current Xcode sessions anduse `MVVMDemo.xcworkspace` for this project from now on.Sending stats
Sending stats
Pod installation complete! There are3 dependencies from the Podfile and 3total
pods installed.

這說明pod install命令執(zhí)行成功了。現(xiàn)在再看一下工程目錄的變化:

從上圖可以看到,多了三個文件:
Podfile.lock:這是 CocoaPods 創(chuàng)建的最重要的文件之一。它記錄了需要被安裝的 pod 的每個已安裝的版本。如果你想知道已安裝的 pod 是哪個版本,可以查看這個文件。推薦將 Podfile.lock 文件加入到版本控制中,這有助于整個團(tuán)隊(duì)的一致性。
MVVMDemo.xcworkspace:從上面的執(zhí)行結(jié)果可以看到,紅色部分的注釋提示我們現(xiàn)在項(xiàng)目用MVVMDemo.xcworkspace來打開,原來的工程設(shè)置已經(jīng)被更改了,如果直接打開原來的工程文件去編譯就會報錯,只能使用新生成的workspace來進(jìn)行項(xiàng)目管理。
Pods:CocoaPods會將所有的第三方庫以target的方式組成一個名為Pods的工程。整個第三方庫工程會生成一個名稱為libPods.a的靜態(tài)庫給MVVMDemo項(xiàng)目使用。
打開MVVMDemo.xcworkspace工程,界面如下:

在項(xiàng)目中引用剛才添加的第三方庫的頭文件,執(zhí)行編譯操作,操作成功。
6.常見問題
問題一:舊工程項(xiàng)目切換到CocoaPods,執(zhí)行“pod install”指令時,有可能出現(xiàn)如下警告信息:

產(chǎn)生上面警告的原因是項(xiàng)目 Target 中的一些設(shè)置,CocoaPods 也做了默認(rèn)的設(shè)置,如果兩個設(shè)置結(jié)果不一致,就會造成問題。修改方案如下:
警告“...target overrides the `OTHER_LDFLAGS` build setting defined...”:點(diǎn)擊項(xiàng)目文件 project.xcodeproj,右鍵顯示包內(nèi)容,用文本編輯器打開project.pbxproj,刪除OTHER_LDFLAGS的地方,保存,執(zhí)行pod update指令即可消除該警告;
警告“...target overrides the `GCC_PREPROCESSOR_DEFINITIONS` build setting defined...”:修改工程target,具體是這兩項(xiàng)“Build Settings -> Other linker flags”和“Build Settings -> Preprocessor Macros”,在這兩處添加“$(inherited)”;修改“Build Settings -> Preprocessor Macros”時,需要留意一下保留DEBUG時的日志打印(DEBUG=1);
警告“...target overrides the `LIBRARY_SEARCH_PATHS` build setting defined...” :修改工程target,具體是“Build Settings -> Library Search Paths”,在這里添加“$(inherited)”;
警告“...target overrides the `HEADER_SEARCH_PATHS` build setting defined...”:修改工程target,具體是“Build Settings -> Header Search Paths”,在這里添加“$(inherited)”;
關(guān)于$(inherited)可查看這兩篇文章:
Xcode 中 Build Setting 的兩處設(shè)置
What is $(inherited) in Xcode's search path settings?
問題二:怎樣在CocoaPods中使用私有庫?
很簡單,兩個步驟:
第一步:引入source源:
source'git@git:/Data/git/ios/GofSpecs.git'
第二步:pod私有庫:
pod'GofKit'
問題三:怎么加快pod install 或pod update指令執(zhí)行時間?
執(zhí)行pod install 或pod update 很多時候都卡在了Analyzing dependencies不動,這是更新本地的pod spec索引文件導(dǎo)致的。通過--no-repo-update標(biāo)志可以不更新本地pod spec索引。當(dāng)然首次install不應(yīng)該添加這個標(biāo)志,后續(xù)修改Podfile的時候可以適當(dāng)使用,加快pod速度。
問題四:怎樣輸出指令詳細(xì)日志?
podinstall--verbose
問題五:怎樣忽略某些文件或文件夾,讓這些文件或文件夾不使用git管理?
在項(xiàng)目的根目錄(跟.git文件夾所在目錄同層)建立.gitignore文件,在里面聲明即可。例如:
#ignore these files
GofViewMakerDemo/Pods/*
上面的.gitignore文件意思就是“GofViewMakerDemo/Pods/*”目錄下的所有文件不使用git管理。
這里有一份可忽略的文件列表:
View Code

問題六:怎樣導(dǎo)入swift庫?
platform :ios,'8.0'use_frameworks!pod'Alamofire','~> 1.3'
關(guān)于Library 和 Framework的詳細(xì)內(nèi)容,可以參看這幾篇文章:
Xcode7 開發(fā)靜態(tài)庫和動態(tài)庫
這里做一個簡單的介紹:
用cocoapods 導(dǎo)入swift 框架 到 swift項(xiàng)目和OC項(xiàng)目都必須要 use_frameworks!
use_frameworks!只能在iOS 8及以上平臺使用;
使用 dynamic frameworks,必須要在Podfile文件中添加 use_frameworks!
不使用use_frameworks!,在執(zhí)行pod update指令之后,會生成對應(yīng)的.a文件(靜態(tài)鏈接庫):

使用use_frameworks!,在執(zhí)行pod update指令之后,會生成對應(yīng)的.frameworks文件(動態(tài)鏈接庫:實(shí)際內(nèi)容為Header + 動態(tài)鏈接庫 + 資源文件):

7.參考資料