cocoapods系列教程---原理篇

cocoapods系列教程---安裝與使用
cocoapods系列教程---Podfile文件
cocoapods系列教程---Podfile.lock文件 和 Spec Repo
cocoapods系列教程---spec文件
cocoapods系列教程---原理篇
cocoapods系列教程---讓自己的開(kāi)源框架支持cocoapods
cocoapods系列教程---模塊化設(shè)計(jì)
cocoapods系列教程---創(chuàng)建私有pods

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

概述

大概的原理仰楚,它是將所有的依賴(lài)庫(kù)都放到另一個(gè)名為 Pods 項(xiàng)目中煎殷,然后讓主項(xiàng)目依賴(lài) Pods 項(xiàng)目箱亿,這樣,源碼管理工作都從主項(xiàng)目移到了 Pods 項(xiàng)目中。

  • Pods 項(xiàng)目最終會(huì)編譯成一個(gè)名為 libPods.a 的文件,主項(xiàng)目只需要依賴(lài)這個(gè) .a 文件即可。(這里糾正下,也有可能是.framework文件)
  • 對(duì)于資源文件值纱,CocoaPods 提供了一個(gè)名為 Pods-resources.sh 的 bash 腳本,該腳本在每次項(xiàng)目編譯的時(shí)候都會(huì)執(zhí)行坯汤,將第三方庫(kù)的各種資源文件復(fù)制到目標(biāo)目錄中虐唠。
  • CocoaPods 通過(guò)一個(gè)名為 Pods.xcconfig 的文件來(lái)在編譯時(shí)設(shè)置所有的依賴(lài)和參數(shù)。

說(shuō)實(shí)話,感覺(jué)知道上面那么多就差不多了,下面的原理我也不太懂,純屬搬運(yùn)工.

核心組件

CocoaPods是用 Ruby 寫(xiě)的惰聂,并由若干個(gè) Ruby 包 (gems) 構(gòu)成的疆偿。在解析整合過(guò)程中,最重要的幾個(gè) gems 分別是: CocoaPods/CocoaPods, CocoaPods/Core, 和 CocoaPods/Xcodeproj (是的搓幌,CocoaPods 是一個(gè)依賴(lài)管理工具 -- 利用依賴(lài)管理進(jìn)行構(gòu)建的杆故!)。CocoaPods 是一個(gè) objc 的依賴(lài)管理工具溉愁,而其本身是利用 ruby 的依賴(lài)管理 gem 進(jìn)行構(gòu)建的.

  • CocoaPods/CocoaPod
    這是是一個(gè)面向用戶的組件处铛,每當(dāng)執(zhí)行一個(gè) pod 命令時(shí),這個(gè)組件都將被激活。該組件包括了所有使用 CocoaPods 涉及到的功能撤蟆,并且還能通過(guò)調(diào)用所有其它的 gems 來(lái)執(zhí)行任務(wù)篙贸。
  • CocoaPods/Core
    Core 組件提供支持與 CocoaPods 相關(guān)文件的處理,文件主要是 Podfile 和 podspecs枫疆。
  • Podfile
    Podfile 是一個(gè)文件,用于定義項(xiàng)目所需要使用的第三方庫(kù).
  • Podspec
    .podspec 也是一個(gè)文件敷鸦,該文件描述了一個(gè)庫(kù)是怎樣被添加到工程中的息楔。它支持的功能有:列出源文件、framework扒披、編譯選項(xiàng)和某個(gè)庫(kù)所需要的依賴(lài)等.
  • CocoaPods/Xcodeproj
    這個(gè) gem 組件負(fù)責(zé)所有工程文件的整合值依。它能夠?qū)?chuàng)建并修改 .xcodeproj 和 .xcworkspace 文件。它也可以作為單獨(dú)的一個(gè) gem 包使用碟案。如果你想要寫(xiě)一個(gè)腳本來(lái)方便的修改工程文件愿险,那么可以使用這個(gè) gem

運(yùn)行 pod install 命令

當(dāng)運(yùn)行 pod install 命令時(shí)會(huì)引發(fā)許多操作。要想深入了解這個(gè)命令執(zhí)行的詳細(xì)內(nèi)容价说,可以在這個(gè)命令后面加上 --verbose辆亏。可以看到類(lèi)似如下的內(nèi)容:

$ 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


分析過(guò)程
  • 讀取 Podfile 文件,分析有哪些第三方依賴(lài)庫(kù)以及對(duì)應(yīng)的版本

  • 加載源文件. 每個(gè) .podspec 文件都包含一個(gè)源代碼的索引鳖目,這些索引一般包裹一個(gè) git 地址和 git tag扮叨。它們以 commit SHAs 的方式存儲(chǔ)在 ~/Library/Caches/CocoaPods 中。這個(gè)路徑中文件的創(chuàng)建是由 Core gem 負(fù)責(zé)的领迈。CocoaPods 將依照 Podfile彻磁、.podspec 和緩存文件的信息將源文件下載到 Pods 目錄中。

  • 生成 Pods.xcodeproj.每次 pod install 執(zhí)行狸捅,如果檢測(cè)到改動(dòng)時(shí)衷蜓,CocoaPods 會(huì)利用 Xcodeproj gem 組件對(duì) Pods.xcodeproj 進(jìn)行更新。如果該文件不存在尘喝,則用默認(rèn)配置生成磁浇。否則,會(huì)將已有的配置項(xiàng)加載至內(nèi)存中瞧省。

  • 安裝第三方庫(kù).當(dāng) CocoaPods 往工程中添加一個(gè)第三方庫(kù)時(shí)扯夭,不僅僅是添加代碼這么簡(jiǎn)單,還會(huì)添加很多內(nèi)容鞍匾。由于每個(gè)第三方庫(kù)有不同的 target交洗,因此對(duì)于每個(gè)庫(kù),都會(huì)有幾個(gè)文件需要添加橡淑,每個(gè) target 都需要:

    • 一個(gè)包含編譯選項(xiàng)的 .xcconfig 文件
    • 一個(gè)同時(shí)包含編譯設(shè)置和 CocoaPods 默認(rèn)配置的私有 .xcconfig 文件
    • 一個(gè)編譯所必須的 prefix.pch 文件
    • 另一個(gè)編譯必須的文件 dummy.m

一旦每個(gè) pod 的 target 完成了上面的內(nèi)容构拳,整個(gè) Pods target 就會(huì)被創(chuàng)建。這增加了相同文件的同時(shí),還增加了另外幾個(gè)文件置森。如果源碼中包含有資源 bundle斗埂,將這個(gè) bundle 添加至程序 target 的指令將被添加到 Pods-Resources.sh 文件中。還有一個(gè)名為 Pods-environment.h 的文件凫海,文件中包含了一些宏呛凶,這些宏可以用來(lái)檢查某個(gè)組件是否來(lái)自 pod。最后行贪,將生成兩個(gè)認(rèn)可文件漾稀,一個(gè)是 plist,另一個(gè)是 markdown建瘫,這兩個(gè)文件用于給最終用戶查閱相關(guān)許可信息.

  • 寫(xiě)入磁盤(pán). 直到現(xiàn)在崭捍,許多工作都是在內(nèi)存中進(jìn)行的。為了讓這些成果能被重復(fù)利用啰脚,我們需要將所有的結(jié)果保存到一個(gè)文件中殷蛇。所以 Pods.xcodeproj 文件被寫(xiě)入磁盤(pán),另外兩個(gè)非常重要的文件:Podfile.lock 和 Manifest.lock 都將被寫(xiě)入磁盤(pán)橄浓。
    • Podfile.lock ,這是 CocoaPods 創(chuàng)建的最重要的文件之一粒梦。它記錄了需要被安裝的 pod 的每個(gè)已安裝的版本。如果你想知道已安裝的 pod 是哪個(gè)版本荸实,可以查看這個(gè)文件谍倦。推薦將 Podfile.lock 文件加入到版本控制中,這有助于整個(gè)團(tuán)隊(duì)的一致性泪勒。
    • Manifest.lock 這是每次運(yùn)行 pod install 命令時(shí)創(chuàng)建的 Podfile.lock 文件的副本昼蛀。如果你遇見(jiàn)過(guò)這樣的錯(cuò)誤 沙盒文件與 Podfile.lock 文件不同步 (The sandbox is not in sync with the Podfile.lock),這是因?yàn)?Manifest.lock 文件和 Podfile.lock 文件不一致所引起圆存。由于 Pods 所在的目錄并不總在版本控制之下叼旋,這樣可以保證開(kāi)發(fā)者運(yùn)行 app 之前都能更新他們的 pods,否則 app 可能會(huì) crash沦辙,或者在一些地方編譯失敗夫植。
    • xcproj ,如果你已經(jīng)依照我們的建議在系統(tǒng)上安裝了 xcproj,它會(huì)對(duì) Pods.xcodeproj 文件執(zhí)行一下 touch 以將其轉(zhuǎn)換成為舊的 ASCII plist 格式的文件油讯。為什么要這么做呢详民?雖然在很久以前就不被其它軟件支持了,但是 Xcode 仍然依賴(lài)于這種格式陌兑。如果沒(méi)有 xcproj沈跨,你的 Pods.xcodeproj 文件將會(huì)以 XML 格式的 plist 文件存儲(chǔ),當(dāng)你用 Xcode 打開(kāi)它時(shí)兔综,它會(huì)被改寫(xiě)饿凛,并造成大量的文件改動(dòng)狞玛。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涧窒,隨后出現(xiàn)的幾起案子心肪,更是在濱河造成了極大的恐慌,老刑警劉巖纠吴,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硬鞍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡戴已,警方通過(guò)查閱死者的電腦和手機(jī)膳凝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)恭陡,“玉大人,你說(shuō)我怎么就攤上這事上煤⌒萃妫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵劫狠,是天一觀的道長(zhǎng)拴疤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)独泞,這世上最難降的妖魔是什么呐矾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮懦砂,結(jié)果婚禮上蜒犯,老公的妹妹穿的比我還像新娘。我一直安慰自己荞膘,他們只是感情好罚随,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著羽资,像睡著了一般淘菩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屠升,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天潮改,我揣著相機(jī)與錄音,去河邊找鬼腹暖。 笑死汇在,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脏答。 我是一名探鬼主播趾疚,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼缨历,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了糙麦?” 一聲冷哼從身側(cè)響起辛孵,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赡磅,沒(méi)想到半個(gè)月后魄缚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焚廊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年冶匹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咆瘟。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嚼隘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袒餐,到底是詐尸還是另有隱情飞蛹,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布灸眼,位于F島的核電站卧檐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏焰宣。R本人自食惡果不足惜霉囚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匕积。 院中可真熱鬧盈罐,春花似錦、人聲如沸闪唆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)苞氮。三九已至湾揽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笼吟,已是汗流浹背库物。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贷帮,地道東北人戚揭。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像撵枢,于是被迫代替她去往敵國(guó)和親民晒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子精居,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 項(xiàng)目組件化、平臺(tái)化是技術(shù)公司的共同目標(biāo)潜必,越來(lái)越多的技術(shù)公司推崇使用pod管理第三方庫(kù)以及私有組件靴姿,一方面使項(xiàng)目架構(gòu)...
    swu_luo閱讀 21,475評(píng)論 0 39
  • CocoaPods 是什么? CocoaPods 是一個(gè)負(fù)責(zé)管理 iOS 項(xiàng)目中第三方開(kāi)源庫(kù)的工具磁滚。CocoaPo...
    朝洋閱讀 25,636評(píng)論 3 51
  • Ruby 安裝 要安裝cocospods 首先需要安裝ruby佛吓,可以先安裝xcode,再安裝macport 垂攘,最后...
    山天大畜閱讀 1,844評(píng)論 0 1
  • 一. CocoaPods的介紹 什么是CocoaPods维雇?CocoaPods是一個(gè)負(fù)責(zé)管理iOS項(xiàng)目中第三方開(kāi)源庫(kù)...
    輝712閱讀 3,913評(píng)論 0 7
  • 2009年那年,因?yàn)椴稍L任務(wù)晒他,我去了水電八局承建的京滬高鐵的鄒城制梁廠2-3次吱型,那年的宣傳培訓(xùn)班就是在那里召開(kāi)的。...
    苛娃閱讀 895評(píng)論 3 3