CocoaPods 簡介
每種語言發(fā)展到一個(gè)階段,就會(huì)出現(xiàn)相應(yīng)的依賴管理工具,例如 Java 語言的 Maven,nodejs 的 npm。隨著 iOS 開發(fā)者的增多,業(yè)界也出現(xiàn)了為 iOS 程序提供依賴管理的工具,它的名字叫做:CocoaPods。
CocoaPods項(xiàng)目的源碼 在 Github 上管理。該項(xiàng)目開始于 2011 年 8 月 12 日,經(jīng)過多年發(fā)展,現(xiàn)在已經(jīng)成為 iOS 開發(fā)事實(shí)上的依賴管理標(biāo)準(zhǔn)工具。開發(fā) iOS 項(xiàng)目不可避免地要使用第三方開源庫,CocoaPods 的出現(xiàn)使得我們可以節(jié)省設(shè)置和更新第三方開源庫的時(shí)間。
在iOS開發(fā)時(shí),使用了 24 個(gè)第三方開源庫。在沒有使用 CocoaPods 以前,我需要:
1.把這些第三方開源庫的源代碼文件復(fù)制到項(xiàng)目中,或者設(shè)置成 git 的 submodule。
2/對(duì)于這些開源庫通常需要依賴系統(tǒng)的一些 framework,我需要手工地將這些 framework 分別增加到項(xiàng)目依賴中,比如通常情況下,一個(gè)網(wǎng)絡(luò)庫就需要增加以下 framework: CFNetwork, SystemConfiguration, MobileCoreServices, CoreGraphics, zlib。
3.對(duì)于某些開源庫,我還需要設(shè)置-licucore或者 -fno-objc-arc等編譯參數(shù)
管理這些依賴包的更新。
這些體力活雖然簡單,但毫無技術(shù)含量并且浪費(fèi)時(shí)間。在使用 CocoaPods 之后,我只需要將用到的第三方開源庫放到一個(gè)名為 Podfile 的文件中,然后執(zhí)行pod install。
CocoaPods 就會(huì)自動(dòng)將這些第三方開源庫的源碼下載下來,并且為我的工程設(shè)置好相應(yīng)的系統(tǒng)依賴和編譯參數(shù)。
安裝
(1)、將Ruby 的軟件源替換成國內(nèi)的
ruby 的軟件源( https://rubygems.org )使用的是亞馬遜的云服務(wù),所以自帶的需要翻墻,但我們可以使用如下代碼將官方的 ruby 源替換成國內(nèi)淘寶的源(https://ruby.taobao.org/ )或者是由 Ruby China 社區(qū)專注維護(hù)的這個(gè)源(https://gems.ruby-china.org/ )。(我在鏡像的時(shí)候開始用的是淘寶的,但會(huì)卡死,可能是不能用了,也可能是網(wǎng)速慢,在后面講“坑”的時(shí)候會(huì)說)。在這我用的是Ruby China 社區(qū)專注維護(hù)的這個(gè)源(https://gems.ruby-china.org/)。
*首先,執(zhí)行以下命令刪除原來的ruby源:
gem sources --remove https://rubygems.org/
然后下一步添加你找到的可用的鏡像源
gem sources -a https://gems.ruby-china.org/
gem sources ? ?//驗(yàn)證新源是否替換成功
*** CURRENT SOURCES ***
https://gems.ruby-china.org
到此ruby 源替已經(jīng)換成國內(nèi)的源
其中可能遇到的坑:
1.之前寫地址時(shí),要注意https,gems,ruby-china的寫法,有時(shí)會(huì)容易寫成http,gem,ruby.china,導(dǎo)致出現(xiàn)莫名其妙的錯(cuò)誤
2.如果出現(xiàn)Error fetching的錯(cuò)誤,注意查查下對(duì)應(yīng)地址是否可以用網(wǎng)頁打開,如果不行,可能DNS地址被劫持了,替換DNS為8.8.8.8/8.8.4.4這兩組GoogleDNS,另外可以斷電幾分鐘重啟下路由器
(2)安裝
很簡單的一句話
sudo gem install -n /usr/local/bin cocoapods
如果gem出現(xiàn)錯(cuò)誤
Unable to resolve dependencies
那么就輸入
sudo gem update --system
然后
pod setup
在此步驟時(shí)間漫長,又最容易出問題,眾多問題親歷見具體案例
創(chuàng)建文件 Podfile
在終端中進(jìn)入(cd命令)你項(xiàng)目所在目錄,然后在當(dāng)前目錄下,創(chuàng)建Podfile,運(yùn)行:
touch profile
然后在Podfile文件中輸入以下文字:
platform :ios, '7.0'
pod "AFNetworking", "~> 2.0"
這時(shí)候,你會(huì)發(fā)現(xiàn)你的項(xiàng)目目錄中,出現(xiàn)一個(gè)名字為Podfile的文件,而且文件內(nèi)容就是你剛剛輸入的內(nèi)容。注意,Podfile文件應(yīng)該和你的工程文件.xcodeproj在同一個(gè)目錄下。
這時(shí)候,你就可以利用CocoPods下載AFNetworking類庫了。還是在終端中的當(dāng)前項(xiàng)目目錄下,運(yùn)行以下命令:
cd "your project home"
pod install
現(xiàn)在,你的所有第三方庫都已經(jīng)下載完成并且設(shè)置好了編譯參數(shù)和依賴,你只需要記住如下 2 點(diǎn)即可:
使用 CocoaPods 生成的 .xcworkspace 文件來打開工程,而不是以前的 .xcodeproj 文件。
每次更改了 Podfile 文件,你需要重新執(zhí)行一次pod update命令。
查找第三方庫
你如果不知道 cocoaPods 管理的庫中,是否有你想要的庫,那么你可以通過 pod search 命令進(jìn)行查找,以下是我用 pod search json 查找到的所有可用的庫:
$ pod search json
-> AnyJSON (0.0.1)
Encode / Decode JSON by any means possible.
- Homepage: https://github.com/mattt/AnyJSON
- Source:? https://github.com/mattt/AnyJSON.git
- Versions: 0.0.1 [master repo]
-> JSONKit (1.5pre)
A Very High Performance Objective-C JSON Library.
- Homepage: https://github.com/johnezang/JSONKit
- Source:? git://github.com/johnezang/JSONKit.git
- Versions: 1.5pre, 1.4 [master repo]
// ... 以下省略若干行
關(guān)于 Podfile.lock
當(dāng)你執(zhí)行pod install之后,除了 Podfile 外,CocoaPods 還會(huì)生成一個(gè)名為Podfile.lock的文件,Podfile.lock 應(yīng)該加入到版本控制里面,不應(yīng)該把這個(gè)文件加入到.gitignore中。因?yàn)镻odfile.lock會(huì)鎖定當(dāng)前各依賴庫的版本,之后如果多次執(zhí)行pod install 不會(huì)更改版本,要pod update才會(huì)改Podfile.lock了。這樣多人協(xié)作的時(shí)候,可以防止第三方庫升級(jí)時(shí)造成大家各自的第三方庫版本不一致。
CocoaPods 的這篇官方文檔也在What is a Podfile.lock一節(jié)中介紹了Podfile.lock的作用,并且指出:
This file should always be kept under version control.
如果 pod update / pod install 命令執(zhí)行過慢
(首次運(yùn)行的時(shí)候不要)執(zhí)行pod install還是pod update都卡在了Analyzing dependencies不動(dòng)原因在于當(dāng)執(zhí)行以上兩個(gè)命令的時(shí)候會(huì)升級(jí)CocoaPods的spec倉庫,加一個(gè)參數(shù)可以省略這一步,然后速度就會(huì)提升不少。
加參數(shù)的命令如下:
pod install --no-repo-update
pod update --no-repo-update
生成第三方庫的幫助文檔
如果你想讓 CococaPods 幫你生成第三方庫的幫助文檔,并集成到 Xcode 中,那么用 brew 安裝 appledoc 即可:
brew install appledoc
關(guān)于 appledoc,在《使用 Objective-C 的文檔生成工具:appledoc》 中有專門介紹。它最大的優(yōu)點(diǎn)是可以將幫助文檔集成到 Xcode 中,這樣你在敲代碼的時(shí)候,按住 opt 鍵單擊類名或方法名,就可以顯示出相應(yīng)的幫助文檔。
pod install 和 pod update
pod install一般是你第一次想要為項(xiàng)目添加pod的時(shí)候使用的,它同樣也使用在你為Podfile文件添加或移除pod庫的時(shí)候。
每次pod install命令運(yùn)行的時(shí)候,pod install會(huì)為每一個(gè)它安裝的pod庫在Podfile.lock文件中寫入其版本號(hào)。Podfile.lock文件追蹤每一個(gè)安裝的pod庫的版本號(hào),并鎖定這些版本號(hào)。
當(dāng)你運(yùn)行pod install是,它將只解決不在Podfile.lock中的pod庫依賴關(guān)系
對(duì)于在Podfile.lock文件中的pod庫,pod install會(huì)只下載Podfile.lock文件中指定的版本,而不會(huì)去檢查這個(gè)庫是否有更新的版本。
對(duì)于不在Podfile.lock文件中的pod庫,pod install會(huì)搜索這個(gè)pod庫在Podfile文件中指定的版本
pod update
當(dāng)你運(yùn)行了pod update PODNAME命令,CocoaPods會(huì)在不考慮Podfile.lock中版本的情況下試著去查找PODNAME的最新版本。pod update PODNAME命令會(huì)將相應(yīng)的pod更新到最新的版本(新版本仍然遵守你在Podfile中做的限制)
唯一能夠保證團(tuán)隊(duì)中所有的成員都用使用pod庫的相同版本的方法就是使用Podfile.lock并且正確的使用pod install和pod update
原理
大概研究了一下 CocoaPods 的原理,它是將所有的依賴庫都放到另一個(gè)名為 Pods 項(xiàng)目中,然后讓主項(xiàng)目依賴 Pods 項(xiàng)目,這樣,源碼管理工作都從主項(xiàng)目移到了 Pods 項(xiàng)目中。發(fā)現(xiàn)的一些技術(shù)細(xì)節(jié)有:
Pods 項(xiàng)目最終會(huì)編譯成一個(gè)名為 libPods.a 的文件,主項(xiàng)目只需要依賴這個(gè) .a 文件即可。
對(duì)于資源文件,CocoaPods 提供了一個(gè)名為 Pods-resources.sh 的 bash 腳本,該腳本在每次項(xiàng)目編譯的時(shí)候都會(huì)執(zhí)行,將第三方庫的各種資源文件復(fù)制到目標(biāo)目錄中。
CocoaPods 通過一個(gè)名為 Pods.xcconfig 的文件來在編譯時(shí)設(shè)置所有的依賴和參數(shù)。