cocoapods系列教程---安裝與使用
cocoapods系列教程---Podfile文件
cocoapods系列教程---Podfile.lock文件 和 Spec Repo
cocoapods系列教程---spec文件
cocoapods系列教程---原理篇
cocoapods系列教程---讓自己的開源框架支持cocoapods
cocoapods系列教程---模塊化設計
cocoapods系列教程---創建私有pods
概述
大概的原理,它是將所有的依賴庫都放到另一個名為 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 打開它時,它會被改寫,并造成大量的文件改動。