CocoaPods是什么屠尊?
CocoaPods是iOS平臺(tái)當(dāng)前最流行的包管理工具旷祸,可以將它理解為一個(gè)可以自動(dòng)部署到項(xiàng)目的組件池,而對(duì)應(yīng)的podfile文件就相當(dāng)于請(qǐng)求組件的Request讼昆。當(dāng)組件下載到工程后托享,CocoaPods會(huì)自動(dòng)完成組件集成到現(xiàn)有項(xiàng)目的工作弓熏,并完成修改.xcodeproj文件和創(chuàng)建.xcworkspace文件敬尺。最終將所有組件統(tǒng)一打包成Pods.a或者Pods.framework靜態(tài)庫(kù),供項(xiàng)目使用榴徐。(類(lèi)似于JS依賴包管理工具npm)
在CocoaPods中既峡,會(huì)存在以下幾種文件:
- podspec
Pod的描述文件羡榴,一般來(lái)說(shuō)表征你的項(xiàng)目地址,項(xiàng)目使用的平臺(tái)和版本等信息 - podfile
用戶編寫(xiě)的對(duì)于期望加載的pod以及對(duì)應(yīng)Target信息 - podfile.lock
記錄了之前pod加載時(shí)的一些信息运敢,包括版本校仑、依賴、CocoaPods版本等 - mainfest.lock
記錄了本地pod的基本信息传惠,實(shí)際上是podfile.lock的拷貝
大部分開(kāi)發(fā)者最熟悉的cocoaPods指令就是pod install
迄沫,那具體在執(zhí)行pod install時(shí)發(fā)生了什么呢?
pod install 運(yùn)行原理分析
當(dāng)我們運(yùn)行pod install
時(shí)卦方,實(shí)際上 發(fā)生了下面這些步驟:
- 分析dependency
對(duì)比本地Pod和podfile.lock文件中的版本邢滑,如果不一致會(huì)提示存在風(fēng)險(xiǎn)。 - 對(duì)比podfile是否發(fā)生了變化愿汰,add/remove pod依賴
如果存在 困后,會(huì)生成兩個(gè)列表,一個(gè)是需要add的pods衬廷,一個(gè)是需要remove的pods摇予。 - 如果存在remove的,刪除remove的pods(會(huì)刪除podfile.lock里的版本依賴)吗跋。
- 添加需要的pods依賴
此時(shí)侧戴,如果是常規(guī)的CocoaPods庫(kù)(基于git),會(huì)先去:
Spec下查找對(duì)應(yīng)的Pods文件夾
找到對(duì)應(yīng)的tag
找到對(duì)應(yīng)tag下面的podspec文件
-
git clone下來(lái)代碼并copy到Pod目錄下
目錄結(jié)構(gòu).png 運(yùn)行pre-install hook
- 生成Pod Project
- 將該pod文件添加到工程中
- 添加對(duì)應(yīng)的framework、.a庫(kù)跌宛、bundle等
- 鏈接頭文件酗宋,生成Target
- 運(yùn)行post-install hook
- 生成podfile.lock ,之后生成文件副本mainfest.lock并將其放在Pod文件夾內(nèi)疆拘。(如果出現(xiàn) The sandbox is not sync with the podfile.lock這種錯(cuò)誤蜕猫,則表示manifest.lock和podfile.lock文件不一致),此時(shí)一般需要重新運(yùn)行pod install命令哎迄。
- 配置原有的project文件(add build phase)
- 添加了
Embed Pods Frameworks
- 添加了
Copy Pod Resources
其中回右,pre-install hook和post-install hook可以理解成回調(diào)函數(shù)隆圆,是在podfile里對(duì)于install之前或者之后(生成工程但是還沒(méi)寫(xiě)入磁盤(pán))可以執(zhí)行的邏輯,邏輯為:
pre_install do |installer|
# 做一些安裝之前的hook
end
post_install do |installer|
# 做一些安裝之后的hook
end
注意:pod install
優(yōu)先遵循 Podfile 里指定的版本信息,其次遵循 Podfile.lock 里指定的版本信息來(lái)安裝對(duì)應(yīng)的依賴庫(kù)翔烁。
Xcode工程有什么變化
在cocoaPods和Xcode工程進(jìn)行集成的過(guò)程中渺氧,會(huì)有有以下流程:
- 創(chuàng)建workspace
創(chuàng)建xcworkspace文件。其實(shí)xcworkspace文件本質(zhì)上只是xcodeproject的集合蹬屹,數(shù)據(jù)結(jié)構(gòu)如下:
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Demo/Demo.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
- create group
在工程中創(chuàng)建group文件夾侣背,邏輯上隔離一些文件 - create pod project & add pod library
創(chuàng)建pod.xcodeproject工程,并且將在podfile中定義的第三方庫(kù)引入到這個(gè)工程之中慨默。 -
add embed frameworks script phase
添加了[CP] Embed Pods Frameworks贩耐,相應(yīng)的,多了pods_xxx的group业筏,下列xxx.framework.sh,來(lái)完成將內(nèi)部第三方庫(kù)打包成.a靜態(tài)庫(kù)文件(在Podfile中如果選擇了use_frameworks!鸟赫,則此步驟會(huì)打包成.framework)
[CP] Embed Pods Frameworks
[CP] Embed Pods Frameworks
- remove embed frameworks script phase
如果本次podfile刪除了部分第三方庫(kù)蒜胖,則此步驟會(huì)刪除掉不需要的第三方庫(kù),將其的引用關(guān)系從Pod.xcodeproject工程中拿走抛蚤。 -
add copy resource script phase
如果第三方庫(kù)存在資源bundle台谢,則此步驟會(huì)將資源文件進(jìn)行復(fù)制到集中的目錄中,方便統(tǒng)一進(jìn)行打包和封裝岁经。相應(yīng)的朋沮,會(huì)添加[CP] Copy Pods Resources腳本。
[CP] Copy Pods Resources - add check manifest.lock script phase
前文提到過(guò)缀壤,manifest.lock其實(shí)是podfile.lock的副本樊拓。此步驟會(huì)進(jìn)行diff,如果存在不一致塘慕,則會(huì)提示著名的那句The sandbox is not sync with the podfile.lock錯(cuò)誤筋夏。 - add user script phase
此步驟是對(duì)原有project工程文件進(jìn)行改造。在運(yùn)行過(guò)pod install后图呢,再次打開(kāi)原有工程會(huì)發(fā)現(xiàn)無(wú)法編譯通過(guò)条篷,因?yàn)橐呀?jīng)做了改動(dòng)。 -
首先蛤织,添加了對(duì)Pod工程的依賴赴叹,具體為引用中多了libPods_xxx.a文件。此步驟的.a文件(或者.framework文件)為上述步驟中xxx.framework.sh打包出來(lái)的文件指蚜,也就是說(shuō)乞巧,cocoaPods會(huì)把所有第三方的組件封裝為一個(gè).a文件(或者.framework文件)!
靜態(tài)文件引入
*建立了Pods的group摊鸡,內(nèi)含pods-xxx-debug.xconfig和pods-xxx.release.xconfig文件摊欠。這兩個(gè)文件是對(duì)應(yīng)工程的build phase的配置丢烘。相應(yīng)的,主工程的Iinfo->Configurations的debug和release配置會(huì)對(duì)應(yīng)上述兩個(gè)配置文件些椒。
Configurations - 上述兩個(gè)配置都做了什么播瞳?包括:
Header_search_path,指向了Pod/Headers/public/xxx免糕,添加了Pods文件編譯后的頭文件地址
Other_LDFLAGS赢乓,添加了-ObjC等等
一些Pods變了,例如Pods_BUILD_DIR等
至此石窑,原有xcode工程和新建的Pod工程完成了集成和融合牌芋。