cocoapods系列教程---原理篇

cocoapods系列教程---安裝與使用
cocoapods系列教程---Podfile文件
cocoapods系列教程---Podfile.lock文件 和 Spec Repo
cocoapods系列教程---spec文件
cocoapods系列教程---原理篇
cocoapods系列教程---讓自己的開源框架支持cocoapods
cocoapods系列教程---模塊化設計
cocoapods系列教程---創建私有pods

參考:https://www.objccn.io/

概述

大概的原理,它是將所有的依賴庫都放到另一個名為 Pods 項目中,然后讓主項目依賴 Pods 項目,這樣,源碼管理工作都從主項目移到了 Pods 項目中。

  • Pods 項目最終會編譯成一個名為 libPods.a 的文件,主項目只需要依賴這個 .a 文件即可。(這里糾正下,也有可能是.framework文件)
  • 對于資源文件,CocoaPods 提供了一個名為 Pods-resources.sh 的 bash 腳本,該腳本在每次項目編譯的時候都會執行,將第三方庫的各種資源文件復制到目標目錄中。
  • CocoaPods 通過一個名為 Pods.xcconfig 的文件來在編譯時設置所有的依賴和參數。

說實話,感覺知道上面那么多就差不多了,下面的原理我也不太懂,純屬搬運工.

核心組件

CocoaPods是用 Ruby 寫的,并由若干個 Ruby 包 (gems) 構成的。在解析整合過程中,最重要的幾個 gems 分別是: CocoaPods/CocoaPods, CocoaPods/Core, 和 CocoaPods/Xcodeproj (是的,CocoaPods 是一個依賴管理工具 -- 利用依賴管理進行構建的!)。CocoaPods 是一個 objc 的依賴管理工具,而其本身是利用 ruby 的依賴管理 gem 進行構建的.

  • CocoaPods/CocoaPod
    這是是一個面向用戶的組件,每當執行一個 pod 命令時,這個組件都將被激活。該組件包括了所有使用 CocoaPods 涉及到的功能,并且還能通過調用所有其它的 gems 來執行任務。
  • CocoaPods/Core
    Core 組件提供支持與 CocoaPods 相關文件的處理,文件主要是 Podfile 和 podspecs。
  • Podfile
    Podfile 是一個文件,用于定義項目所需要使用的第三方庫.
  • Podspec
    .podspec 也是一個文件,該文件描述了一個庫是怎樣被添加到工程中的。它支持的功能有:列出源文件、framework、編譯選項和某個庫所需要的依賴等.
  • CocoaPods/Xcodeproj
    這個 gem 組件負責所有工程文件的整合。它能夠對創建并修改 .xcodeproj 和 .xcworkspace 文件。它也可以作為單獨的一個 gem 包使用。如果你想要寫一個腳本來方便的修改工程文件,那么可以使用這個 gem

運行 pod install 命令

當運行 pod install 命令時會引發許多操作。要想深入了解這個命令執行的詳細內容,可以在這個命令后面加上 --verbose。可以看到類似如下的內容:

$ pod install --verbose

Analyzing dependencies

Updating spec repositories
Updating spec repo `master`
  $ /usr/bin/git pull
  Already up-to-date.


Finding Podfile changes
  - AFNetworking
  - HockeySDK

Resolving dependencies of `Podfile`
Resolving dependencies for target `Pods' (iOS 6.0)
  - AFNetworking (= 1.2.1)
  - SDWebImage (= 3.2)
    - SDWebImage/Core

Comparing resolved specification to the sandbox manifest
  - AFNetworking
  - HockeySDK

Downloading dependencies

-> Using AFNetworking (1.2.1)

-> Using HockeySDK (3.0.0)
  - Running pre install hooks
    - HockeySDK

Generating Pods project
  - Creating Pods project
  - Adding source files to Pods project
  - Adding frameworks to Pods project
  - Adding libraries to Pods project
  - Adding resources to Pods project
  - Linking headers
  - Installing libraries
    - Installing target `Pods-AFNetworking` iOS 6.0
      - Adding Build files
      - Adding resource bundles to Pods project
      - Generating public xcconfig file at `Pods/Pods-AFNetworking.xcconfig`
      - Generating private xcconfig file at `Pods/Pods-AFNetworking-Private.xcconfig`
      - Generating prefix header at `Pods/Pods-AFNetworking-prefix.pch`
      - Generating dummy source file at `Pods/Pods-AFNetworking-dummy.m`
    - Installing target `Pods-HockeySDK` iOS 6.0
      - Adding Build files
      - Adding resource bundles to Pods project
      - Generating public xcconfig file at `Pods/Pods-HockeySDK.xcconfig`
      - Generating private xcconfig file at `Pods/Pods-HockeySDK-Private.xcconfig`
      - Generating prefix header at `Pods/Pods-HockeySDK-prefix.pch`
      - Generating dummy source file at `Pods/Pods-HockeySDK-dummy.m`
    - Installing target `Pods` iOS 6.0
      - Generating xcconfig file at `Pods/Pods.xcconfig`
      - Generating target environment header at `Pods/Pods-environment.h`
      - Generating copy resources script at `Pods/Pods-resources.sh`
      - Generating acknowledgements at `Pods/Pods-acknowledgements.plist`
      - Generating acknowledgements at `Pods/Pods-acknowledgements.markdown`
      - Generating dummy source file at `Pods/Pods-dummy.m`
  - Running post install hooks
  - Writing Xcode project file to `Pods/Pods.xcodeproj`
  - Writing Lockfile in `Podfile.lock`
  - Writing Manifest in `Pods/Manifest.lock`

Integrating client project


分析過程
  • 讀取 Podfile 文件,分析有哪些第三方依賴庫以及對應的版本

  • 加載源文件. 每個 .podspec 文件都包含一個源代碼的索引,這些索引一般包裹一個 git 地址和 git tag。它們以 commit SHAs 的方式存儲在 ~/Library/Caches/CocoaPods 中。這個路徑中文件的創建是由 Core gem 負責的。CocoaPods 將依照 Podfile、.podspec 和緩存文件的信息將源文件下載到 Pods 目錄中。

  • 生成 Pods.xcodeproj.每次 pod install 執行,如果檢測到改動時,CocoaPods 會利用 Xcodeproj gem 組件對 Pods.xcodeproj 進行更新。如果該文件不存在,則用默認配置生成。否則,會將已有的配置項加載至內存中。

  • 安裝第三方庫.當 CocoaPods 往工程中添加一個第三方庫時,不僅僅是添加代碼這么簡單,還會添加很多內容。由于每個第三方庫有不同的 target,因此對于每個庫,都會有幾個文件需要添加,每個 target 都需要:

    • 一個包含編譯選項的 .xcconfig 文件
    • 一個同時包含編譯設置和 CocoaPods 默認配置的私有 .xcconfig 文件
    • 一個編譯所必須的 prefix.pch 文件
    • 另一個編譯必須的文件 dummy.m

一旦每個 pod 的 target 完成了上面的內容,整個 Pods target 就會被創建。這增加了相同文件的同時,還增加了另外幾個文件。如果源碼中包含有資源 bundle,將這個 bundle 添加至程序 target 的指令將被添加到 Pods-Resources.sh 文件中。還有一個名為 Pods-environment.h 的文件,文件中包含了一些宏,這些宏可以用來檢查某個組件是否來自 pod。最后,將生成兩個認可文件,一個是 plist,另一個是 markdown,這兩個文件用于給最終用戶查閱相關許可信息.

  • 寫入磁盤. 直到現在,許多工作都是在內存中進行的。為了讓這些成果能被重復利用,我們需要將所有的結果保存到一個文件中。所以 Pods.xcodeproj 文件被寫入磁盤,另外兩個非常重要的文件:Podfile.lock 和 Manifest.lock 都將被寫入磁盤。
    • Podfile.lock ,這是 CocoaPods 創建的最重要的文件之一。它記錄了需要被安裝的 pod 的每個已安裝的版本。如果你想知道已安裝的 pod 是哪個版本,可以查看這個文件。推薦將 Podfile.lock 文件加入到版本控制中,這有助于整個團隊的一致性。
    • Manifest.lock 這是每次運行 pod install 命令時創建的 Podfile.lock 文件的副本。如果你遇見過這樣的錯誤 沙盒文件與 Podfile.lock 文件不同步 (The sandbox is not in sync with the Podfile.lock),這是因為 Manifest.lock 文件和 Podfile.lock 文件不一致所引起。由于 Pods 所在的目錄并不總在版本控制之下,這樣可以保證開發者運行 app 之前都能更新他們的 pods,否則 app 可能會 crash,或者在一些地方編譯失敗。
    • xcproj ,如果你已經依照我們的建議在系統上安裝了 xcproj,它會對 Pods.xcodeproj 文件執行一下 touch 以將其轉換成為舊的 ASCII plist 格式的文件。為什么要這么做呢?雖然在很久以前就不被其它軟件支持了,但是 Xcode 仍然依賴于這種格式。如果沒有 xcproj,你的 Pods.xcodeproj 文件將會以 XML 格式的 plist 文件存儲,當你用 Xcode 打開它時,它會被改寫,并造成大量的文件改動。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容

  • 項目組件化、平臺化是技術公司的共同目標,越來越多的技術公司推崇使用pod管理第三方庫以及私有組件,一方面使項目架構...
    swu_luo閱讀 22,039評論 0 39
  • CocoaPods 是什么? CocoaPods 是一個負責管理 iOS 項目中第三方開源庫的工具。CocoaPo...
    朝洋閱讀 25,725評論 3 51
  • Ruby 安裝 要安裝cocospods 首先需要安裝ruby,可以先安裝xcode,再安裝macport ,最后...
    山天大畜閱讀 1,878評論 0 1
  • 一. CocoaPods的介紹 什么是CocoaPods?CocoaPods是一個負責管理iOS項目中第三方開源庫...
    輝712閱讀 3,962評論 0 7
  • 2009年那年,因為采訪任務,我去了水電八局承建的京滬高鐵的鄒城制梁廠2-3次,那年的宣傳培訓班就是在那里召開的。...
    苛娃閱讀 920評論 3 3