cocoapods系列教程---安裝與使用
cocoapods系列教程---Podfile文件
cocoapods系列教程---Podfile.lock文件 和 Spec Repo
cocoapods系列教程---spec文件
cocoapods系列教程---原理篇
cocoapods系列教程---讓自己的開(kāi)源框架支持cocoapods
cocoapods系列教程---模塊化設(shè)計(jì)
cocoapods系列教程---創(chuàng)建私有pods
概述
大概的原理仰楚,它是將所有的依賴(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)狞玛。