前言 : 這篇文章將從以下幾個方面去解析下Pods 這是一個技術(shù)分享的文字整理
- CocoaPods是什么
- CocoaPods的構(gòu)成
- 相關(guān)文件的理解
- Pod命令的理解
- CocoaPods幕后發(fā)生了什么
- 使用小技巧
- 如何制作公開庫
- 如何制作私有庫
- 其他
1. CocoaPods 是什么
概述: CocoaPods 是開發(fā) OS X 和 iOS 應(yīng)用程序的一個第三方庫的依賴管理工具糊昙,使用這個工具可以簡化對組件依、更新的過程。新添加一些第三方組件可以直接修改 podfile 然后進(jìn)行 pod install;更新已有第三方組件,可以修改 podfile 然后進(jìn)行 pod update亲桥;自己開發(fā)的組件也可以上傳到 CocoaPods 或者私有倉庫,供其他人使用。
2. CocoaPods構(gòu)成
CocoaPods 是用 Ruby 寫的暗甥,并由若干個 Ruby 包 (gems) 構(gòu)成
CocoaPods/Specs: 這個是一個保存第三方組件 podspec 文件的倉庫。第三方組件開發(fā)完成之后捉捅,會傳一份 podspec 文件傳到 CocoaPods撤防,這個 Specs 包含了每個第三方組件所有版本的 podspec 文件。當(dāng)使用某個第三方組件時棒口,如果這些組件支持 CocoaPods寄月,會在 Podfile 中指定 source;
本地 : ~/.cocoapods/repos/ Github https://github.com/CocoaPods/Specs/tree/master/SpecsCocoaPods/CocoaPods: 這是是一個面向用戶的組件,每當(dāng)執(zhí)行一個 pod 命令時无牵,這個組件都將被激活漾肮。該組件包括了所有使用 CocoaPods 涉及到的功能,并且還能通過調(diào)用所有其它的 gems 來執(zhí)行任務(wù)
CocoaPods/Core: 這個 gem 組件提供支持與 CocoaPods 相關(guān)文件的處理茎毁,例如 Specification克懊、Podfile和 Source忱辅。當(dāng)執(zhí)行 pod install等一些命令時。Core 組件會解析第三方組件開發(fā)者上傳的 podspec 文件和使用者的 podfile,以此確定需要為 project 引入哪些文件谭溉。除此之外墙懂,當(dāng)執(zhí)行與這些文件一些相關(guān)的命令時,也由這部分組件處理扮念,例如使用 pod spec lint來檢測 podspec 文件的有效性损搬。
CocoaPods/Xcodeproj: 使用這個 gem 組件,你可以用 ruby 來創(chuàng)建并修改 Xcode projects柜与。在 CocoaPods 中它負(fù)責(zé)所有工程文件的整合巧勤。如果你想要寫一個腳本來方便的修改工程文件,那么可以單獨(dú)下載這個 gem 并使用
3. 相關(guān)文件
- podfile : Podfile是一個描述一個或多個Xcode項(xiàng)目的目標(biāo)依賴項(xiàng)的規(guī)范, 指定工程中依賴了那些組件弄匕。主要包含了依賴的組件名踢关、組件版本、組件地址.
- podfile.lock : 此文件在第一次運(yùn)行后pod install生成粘茄,并跟蹤已安裝的每個Pod的版本
- Pods: pod集合
- .xcworkspace: 工作區(qū), 項(xiàng)目入口
- Manifest.lock: 這是每次運(yùn)行 pod install 命令時創(chuàng)建的 Podfile.lock 文件的副本签舞。如果你遇見過這樣的錯誤 沙盒文件與 Podfile.lock 文件不同步 (The sandbox is not in sync with the Podfile.lock),這是因?yàn)?Manifest.lock 文件和 Podfile.lock 文件不一致所引起柒瓣。由于 Pods 所在的目錄并不總在版本控制之下儒搭,這樣可以保證開發(fā)者運(yùn)行 app 之前都能更新他們的 pods,否則 app 可能會 crash芙贫,或者在一些不太明顯的地方編譯失敗搂鲫。
4. 相關(guān)命令
+ cache 操作CocoaPods緩存
+ deintegrate 從項(xiàng)目中解壓縮CocoaPods
+ env 顯示Pod環(huán)境
+ init 為當(dāng)前目錄生成一個Podfile
+ install 遵照Podfile.lock 的版本安裝一個依賴
+ ipc 進(jìn)程間通信
+ lib 開發(fā)Pod
+ list 列出所有Pod
+ outdated 顯示過時的項(xiàng)目依賴, 也就是告訴你哪些Pod可以更新了
+ plugins 展示可用的Pod插件
+ search 查詢Pods
+ setup 設(shè)置CocoaPods環(huán)境
+ spec 管理 pod specs
+ trunk 與CocoaPods API交互 (例如想要發(fā)布一個specs
+ update 更新過時的項(xiàng)目依賴關(guān)系和創(chuàng)造新的Podfile.lock
4.1 Pod install 與 Pod update
pod install: 優(yōu)先安裝 Podfile 中改變的組件,并優(yōu)先遵循 Podfile 中的版本號磺平,其次遵循 Podfile.lock 中的版本號魂仍。如果使用的 Podfile 中版本號,會將新的版本號更新到 Podfile.lock 中拣挪。
pod update [PODNAME]: 會根據(jù)當(dāng)前 Podfile 規(guī)則更新組件擦酌。如果 Podfile 中沒有指定版本號,并不會遵循 Podfile.lock菠劝,而是會拉取最新版本赊舶,并更新 Podfile.lock。
建議:
·新添加一個 pod 時赶诊,使用 pod install笼平,不要使用 pod update 去下載一個新的組件,避免更新其他 pod 的版本舔痪。
·更新 pod 版本時寓调,使用 pod update [PODNAME]。
·沒有必要的話锄码,不要使用全局更新 pod update夺英,避免不必要的更新鸠珠。
4.2 指定Pod版本的幾種方式
pod ‘PodName' : 最新版本的Pod
pod 'PodName', ‘0.9’: 指定唯一版本
pod 'PodName', =>’0.9’ 使用邏輯運(yùn)算符
pod 'PodName', ~>’0.9’ 樂觀的運(yùn)算符
///
邏輯運(yùn)算符:
'=> 0.1' 任何高于0.1的版本
'< 0.1' 任何低于0.1的版本
'<= 0.1' 版本0.1和任何較低版本
樂觀的運(yùn)算符:
'~> 0.1.2' 版本0.1.2和版本高達(dá)0.2,不包括0.2和更高
'~> 0.1' 版本0.1和版本高達(dá)1.0秋麸,不包括1.0和更高版本
'~> 0' 版本0及更高版本,這與沒有版本基本相同
https://guides.cocoapods.org/syntax/podfile.html
5. CocoaPods幕后發(fā)生了什么
- 創(chuàng)建或者更新工作區(qū)
- 將項(xiàng)目添加到工作區(qū)
- 將CocoaPods需要的靜態(tài)庫添加到工作區(qū)
- 將libPods.a 添加到 : targets=> build phases => 與庫進(jìn)行鏈接
- 將應(yīng)用程序的目標(biāo)配置更改為CocoaPods
- 添加構(gòu)建階段以將資源從您安裝的任何Pod復(fù)制到應(yīng)用的程序包
5.1 Pod install的過程
- 查看 ~/.cocoapods/repo/master/Specs (是否存在) 而非是不是最新!!
- 存在炬太,也就是校驗(yàn)Podfile并讀取Podfile 也就是從這個本地三方庫信息庫中獲取 Podfile 中對應(yīng)三方庫的 git 地址
- 不存在灸蟆,輸出 Setting up CocoaPods Master repo,并拉取三方庫信息庫到 ~/.cocoapods/repo/中
- 使用 git 命令從 GitHub 上拉取 Podfile 中對應(yīng)的三方庫源碼
- 生成Pods.xcodeproj 如果檢測到改動時亲族,CocoaPods 會利用 Xcodeproj gem 組件對 Pods.xcodeproj 進(jìn)行更新炒考。如果該文件不存在,則用默認(rèn)配置生成
pod install —verbose /// 可以看到一個詳細(xì)的過程
6. 小技巧
大家在使用 pod install 命令時一般會加上 --no-repo-update 選項(xiàng)霎迫。這使得 pod install 不進(jìn)行本地三方庫信息庫 git pull 的更新操作斋枢。若 Podfile 中指定 Alamofire 的版本號為 4.2.0,但本地 ~/cocoapods/repo/master/Specs/Alamofire 中并沒有此版本號,此時使用 pod install --no-repo-update 會出現(xiàn)如下錯誤
eg : cocoapods install error:None of your spec sources contain a spec satisfying the dependencies: Alamofire(~ 4.2.0).
若直接使用 pod install 便會先執(zhí)行 pod repo update知给,由于 github 需要翻墻瓤帚,并且更新的內(nèi)容過大就會等待很久。
既然知道了 Cocoapods 的原理涩赢,我們便可以手動在 ~./cocoapods/repo/master/Specs 中添加我們需要的三方庫版本信息戈次,避免了把所有的并沒有使用到的三方庫信息更新到本地。
下面以添加 Alamofire 4.2.0 版本信息到本地為例子筒扒。
6.1 具體操作
cd ~/.cocoapods/repo/master/Specs/Alamofire/
mkdir 4.2.0
cp ~/.cocoapods/repo/master/Specs/Alamofire/1.1.3/Alamofire.podspec.json ./4.2.0
上面的命令創(chuàng)建了名為 4.2.0 的文件夾怯邪,并復(fù)制了一個庫信息的 json 文件到新創(chuàng)建的文件夾中,用 vi 打開該文件, 我們需要修改版本號花墩,source 的 tag悬秉。那 source 的 tag 怎么知道是多少呢,這個可以從 GitHub 上找到冰蘑。
https://github.com/Alamofire/Alamofire/releases 這里可以找到release版本對應(yīng)的tag
7. 制作公開庫
- 創(chuàng)建倉庫的時候要添加一個許可證(Add a license)
- pod trunk register 1005430006@qq.com 'summerxx27' --verbose
- pod trunk me
- pod spec create PodName
- vim PodName.podspec
- pod lib lint PodName.podspec
- 把編輯好的文件推送到代碼庫 git tag ‘1.0.1' git push —tags
- pod trunk push PodName.podspec
可以參照我之前寫的給庫 添加CocoaPods支持
7.1 Podspec 示例
Pod::Spec.new do |spec|
spec.name = 'Reachability'
spec.version = '3.1.0'
spec.license = { :type => 'BSD' }
spec.homepage = 'https://github.com/tonymillion/Reachability'
spec.authors = { 'Tony Million' => 'tonymillion@gmail.com' }
spec.summary = 'ARC and GCD Compatible Reachability Class for iOS and OS X.'
spec.source = { :git => 'https://github.com/tonymillion/Reachability.git', :tag => 'v3.1.0' }
spec.source_files = 'Reachability.{h,m}'
spec.framework = 'SystemConfiguration'
end
7.2 更新公開庫
- 把本地的文件podspec 版本更新一下以及更新的代碼 1.0,0 - > 1.0.1 并推送到git
- cd 到工程的根目錄: cd /Users/jingtian9/Downloads/GITHUB_REPO/XTAlertViewController
- git tag -a 1.0.1 -m 'description'
- git push origin 1.0.1
- pod trunk push PodName.podspec
- pod search PodName
本地文件目錄展示
8. 開發(fā)一個私有Pod的工作流程
- Podspec文件編寫
- Podfile編寫路徑修改
pod 'IMUIKit', :path => "/本地路徑/trunk/kk_espw/IMUIKit"
pod 'IMUIKit', :svn => 'svn地址/trunk/IMUIKit’
9. 其他
1. 使用Pod打包靜態(tài)庫:
https://punmy.cn/2019/05/25/使用cocoapods-packager打包靜態(tài)庫.html
2. 使用CocoaPod進(jìn)行單元測試:
http://www.reibang.com/p/0cca4e12abe7
3. Pod相關(guān)的一些插件:
https://guides.cocoapods.org/plugins/setting-up-plugins.html