pod install的深入理解

CocoaPods是什么?

CocoaPods是iOS平臺當前最流行的包管理工具,可以將它理解為一個可以自動部署到項目的組件池,而對應(yīng)的podfile文件就相當于請求組件的Request。當組件下載到工程后,CocoaPods會自動完成組件集成到現(xiàn)有項目的工作,并完成修改.xcodeproj文件和創(chuàng)建.xcworkspace文件。最終將所有組件統(tǒng)一打包成Pods.a或者Pods.framework靜態(tài)庫,供項目使用。(類似于JS依賴包管理工具npm)

在CocoaPods中,會存在以下幾種文件:

  • podspec
    Pod的描述文件,一般來說表征你的項目地址,項目使用的平臺和版本等信息
  • podfile
    用戶編寫的對于期望加載的pod以及對應(yīng)Target信息
  • podfile.lock
    記錄了之前pod加載時的一些信息,包括版本、依賴、CocoaPods版本等
  • mainfest.lock
    記錄了本地pod的基本信息,實際上是podfile.lock的拷貝
    大部分開發(fā)者最熟悉的cocoaPods指令就是pod install,那具體在執(zhí)行pod install時發(fā)生了什么呢?

pod install 運行原理分析

當我們運行pod install時,實際上 發(fā)生了下面這些步驟:

  • 分析dependency
    對比本地Pod和podfile.lock文件中的版本,如果不一致會提示存在風險。
  • 對比podfile是否發(fā)生了變化,add/remove pod依賴
    如果存在 ,會生成兩個列表,一個是需要add的pods,一個是需要remove的pods。
  • 如果存在remove的,刪除remove的pods(會刪除podfile.lock里的版本依賴)。
  • 添加需要的pods依賴
    此時,如果是常規(guī)的CocoaPods庫(基于git),會先去:
  • Spec下查找對應(yīng)的Pods文件夾

  • 找到對應(yīng)的tag

  • 找到對應(yīng)tag下面的podspec文件

  • git clone下來代碼并copy到Pod目錄下


    目錄結(jié)構(gòu).png
  • 運行pre-install hook

  • 生成Pod Project
  • 將該pod文件添加到工程中
  • 添加對應(yīng)的framework、.a庫、bundle等
  • 鏈接頭文件,生成Target
  • 運行post-install hook
  • 生成podfile.lock ,之后生成文件副本mainfest.lock并將其放在Pod文件夾內(nèi)。(如果出現(xiàn) The sandbox is not sync with the podfile.lock這種錯誤,則表示manifest.lock和podfile.lock文件不一致),此時一般需要重新運行pod install命令。
  • 配置原有的project文件(add build phase)
  • 添加了 Embed Pods Frameworks
  • 添加了 Copy Pod Resources
    其中,pre-install hook和post-install hook可以理解成回調(diào)函數(shù),是在podfile里對于install之前或者之后(生成工程但是還沒寫入磁盤)可以執(zhí)行的邏輯,邏輯為:
pre_install do |installer| 
    # 做一些安裝之前的hook
end

post_install do |installer| 
    # 做一些安裝之后的hook
end

注意:pod install優(yōu)先遵循 Podfile 里指定的版本信息,其次遵循 Podfile.lock 里指定的版本信息來安裝對應(yīng)的依賴庫。

Xcode工程有什么變化

在cocoaPods和Xcode工程進行集成的過程中,會有有以下流程:

  • 創(chuàng)建workspace
    創(chuàng)建xcworkspace文件。其實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中定義的第三方庫引入到這個工程之中。
  • add embed frameworks script phase
    添加了[CP] Embed Pods Frameworks,相應(yīng)的,多了pods_xxx的group,下列xxx.framework.sh,來完成將內(nèi)部第三方庫打包成.a靜態(tài)庫文件(在Podfile中如果選擇了use_frameworks!,則此步驟會打包成.framework)


    [CP] Embed Pods Frameworks

    [CP] Embed Pods Frameworks

  • remove embed frameworks script phase
    如果本次podfile刪除了部分第三方庫,則此步驟會刪除掉不需要的第三方庫,將其的引用關(guān)系從Pod.xcodeproject工程中拿走。
  • add copy resource script phase
    如果第三方庫存在資源bundle,則此步驟會將資源文件進行復制到集中的目錄中,方便統(tǒng)一進行打包和封裝。相應(yīng)的,會添加[CP] Copy Pods Resources腳本。


    [CP] Copy Pods Resources
  • add check manifest.lock script phase
    前文提到過,manifest.lock其實是podfile.lock的副本。此步驟會進行diff,如果存在不一致,則會提示著名的那句The sandbox is not sync with the podfile.lock錯誤。
  • add user script phase
    此步驟是對原有project工程文件進行改造。在運行過pod install后,再次打開原有工程會發(fā)現(xiàn)無法編譯通過,因為已經(jīng)做了改動。
  • 首先,添加了對Pod工程的依賴,具體為引用中多了libPods_xxx.a文件。此步驟的.a文件(或者.framework文件)為上述步驟中xxx.framework.sh打包出來的文件,也就是說,cocoaPods會把所有第三方的組件封裝為一個.a文件(或者.framework文件)!


    靜態(tài)文件引入

    *建立了Pods的group,內(nèi)含pods-xxx-debug.xconfig和pods-xxx.release.xconfig文件。這兩個文件是對應(yīng)工程的build phase的配置。相應(yīng)的,主工程的Iinfo->Configurations的debug和release配置會對應(yīng)上述兩個配置文件。


    Configurations
  • 上述兩個配置都做了什么?包括:
    Header_search_path,指向了Pod/Headers/public/xxx,添加了Pods文件編譯后的頭文件地址
    Other_LDFLAGS,添加了-ObjC等等
    一些Pods變了,例如Pods_BUILD_DIR等
    至此,原有xcode工程和新建的Pod工程完成了集成和融合。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容