pod install的深入理解

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工程完成了集成和融合牌芋。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市松逊,隨后出現(xiàn)的幾起案子躺屁,更是在濱河造成了極大的恐慌,老刑警劉巖经宏,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犀暑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡烁兰,警方通過(guò)查閱死者的電腦和手機(jī)耐亏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)沪斟,“玉大人广辰,你說(shuō)我怎么就攤上這事≈髦” “怎么了择吊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)槽奕。 經(jīng)常有香客問(wèn)我干发,道長(zhǎng),這世上最難降的妖魔是什么史翘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任枉长,我火速辦了婚禮,結(jié)果婚禮上琼讽,老公的妹妹穿的比我還像新娘必峰。我一直安慰自己,他們只是感情好钻蹬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布吼蚁。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肝匆。 梳的紋絲不亂的頭發(fā)上粒蜈,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音旗国,去河邊找鬼枯怖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛能曾,可吹牛的內(nèi)容都是我干的度硝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼寿冕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蕊程!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起驼唱,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤藻茂,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后玫恳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辨赐,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年纽窟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肖油。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兼吓。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡臂港,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出视搏,到底是詐尸還是另有隱情审孽,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布浑娜,位于F島的核電站佑力,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏筋遭。R本人自食惡果不足惜打颤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漓滔。 院中可真熱鬧编饺,春花似錦、人聲如沸响驴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)豁鲤。三九已至秽誊,卻和暖如春鲸沮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锅论。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工讼溺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棍厌。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓肾胯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親耘纱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敬肚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355