序:
對于 Cocoapods,你是否還只知道 pod install,pod update,有時候還會摻雜上 pod search, pod setup等,對于它的工作流程都不是很熟悉,又或許你在搞組件化,但是對于pod庫的制作流程有些記不清,可以瀏覽瀏覽
說來慚愧,2015年底參加工作的時候,我的小組長告訴我有一個管理第三方的工具,啥配置都不用管,拉下來就用,升級一個命令就行...
離職之后在另外兩家公司都沒有使用,我對 Cocoapods 的感覺,好像什么都知道,又好像什么都不知道,跳槽到58后發(fā)現(xiàn)這邊在搞組件化用到了,重新整理一下
目錄
- 一、Cocopods流程及使用
- 二、pod庫的制作
- 三、pod私有庫的制作(一般用于組件化)
一、Cocopods流程及使用

作用:管理Xcode依賴的第三方框架
手動管理:
1、有可能會添加很多配置及系統(tǒng)依賴框架,繁瑣易錯;
2、如果框架升級了,需要替換本地工程里面的框架,再重新配置。Cocopods管理:
快速、自動集成第三方框架,并編譯成一個libPod.a的靜態(tài)庫在項(xiàng)目中使用。
- 1.1、快速集成+簡單使用
// 1、初始化pod(會自動生成Podfile等文件)
- pod init
// 2、修改Podfile文件,添加需要的第三方
platform :ios, '9.0'
target 'PodUsageDemo' do
use_frameworks!
pod 'AFNetworking'
end
// 3、下載安裝
- pod install



- 1.2、Podfile文件
Podfile 是一種規(guī)范,描述了一個或多個 Xcode 項(xiàng)目的目標(biāo)的依賴關(guān)系
// 1、根據(jù)不同的target下載不同的第三方代碼
target 'ProjectName' do
pod 'AFNetworking'
pod 'SDWebImage'
end
target 'NotificationService' do
pod 'GTExtensionSDK', '2.2.4'
end
// 2、版本控制
pod 'AFNetworking' # 使用最新版本
pod 'AFNetworking', '3.0.0' # 只使用3.0.0版本
除了沒有版本或特定版本之外,還可以使用邏輯運(yùn)算符:
pod 'AFNetworking', '> 0.1' # 任何高于 0.1 的版本
pod 'AFNetworking', '>= 0.1' # 0.1 版及更高版本
pod 'AFNetworking', '< 0.1' # 任何低于 0.1 的版本
pod 'AFNetworking', '<= 0.1' # 版本 0.1 和任何更低版本
除了邏輯運(yùn)算符之外,CocoaPods 還有一個樂觀運(yùn)算符~>:
pod 'AFNetworking', '~> 0.1.2 ' # 0.1.2 及 0.2 及以下版本,不包括 0.2 及更高版本
pod 'AFNetworking', '~> 0.1' # 0.1 及 1.0 以下的版本,不包括 1.0 及更高版本
pod 'AFNetworking', '~> 0' # 版本 0 和 1.0 之前的版本,不包括 1.0 及更高版本
// 3、使用本地文件夾路徑(通常用于本地庫,一般建議采用相對路徑,避免重新配置)
pod 'AFNetworking', :path => '~/Documents/AFNetworking' # 絕對路徑
pod 'AFNetworking', :path => '../AFNetworking' # 相對路徑
// 4、使用遠(yuǎn)程索引庫的地址
# 使用遠(yuǎn)程地址
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git'
# 使用遠(yuǎn)程地址 + 'dev'分支
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :branch => 'dev'
# 使用遠(yuǎn)程地址 + 'tag'標(biāo)簽
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => '3.1.1'
# 使用遠(yuǎn)程地址 + 'commit'提交記錄
pod 'AFNetworking', :git => ''https://github.com/AFNetworking/AFNetworking.git', :commit => '0f506b1c45'
何時使用
pod install :添加、刪除pod的時候(即使工程中已經(jīng)存在Podfile或者已經(jīng)執(zhí)行過pod install)
pod update [#PODNAME] :僅在要將pod 更新到較新版本時使用主要區(qū)別場景
在Podfile文件內(nèi)的框架版本描述中,有沒有制定具體版本
pod --help
+ install Install project dependencies according to versions from a Podfile.lock
+ update Update outdated project dependencies and create new Podfile.lock
1、pod install
- 第一次在工程中使用pods時、每次編輯Podfile文件(新增、移除、更新)時使用;
- 每次執(zhí)行pod install時,除了下載安裝,還會在Podfile.lock文件夾中生成版本信息,用于跟蹤和鎖定該版本;
- Podfile.lock,在第一次運(yùn)行pod install后生成的,記錄每個安裝庫的版本號,并且鎖定了這些版本;
- 對于在Podfile.lock中記錄的版本,該命令會直接下載安裝,不會去檢查是否有新的版本;
- 對于不在Podfile.lock里面的庫,執(zhí)行該命令后會從Podfile文件的信息中查找對應(yīng)版本。
2、pod update
- pod update參照Podfile安裝,如果Podfile中沒有做版本限制,會直接將第三方庫升級為最新的
- 只關(guān)心Podfile中的版本限制,不考慮Podfile.lock里面的限制
- 如果只運(yùn)行pod update,后面沒有跟庫的名字,CocoaPods就會更新Podfile里面所有的庫到最新版本
3、pod outdated
- 會列出所有較Podfile.lock里面有新版本的庫(一般用于更新前檢查)
4、提升安裝速度
輸入pod install或者pod update之后,
- CocoaPods首先會去匹配本地spec庫;
- 在確認(rèn)spec庫不需要更新之后,才會下載相應(yīng)的庫文件;
- 這樣比較耗時,可使用以下命令,跳過spec版本庫更新匹配
pod update --verbose --no-repo-update
pod install --verbose --no-repo-update
5、約定俗稱的規(guī)則
- 提交代碼時,省略Pod文件,其他人克隆源碼后直接執(zhí)行pod install,可節(jié)省遠(yuǎn)程倉庫存儲空間
- 一般添加pod的時候都會指明版本(防止其他人誤更新)
- 關(guān)于升級:除非組內(nèi)一起升級,保持版本同步才會執(zhí)行pod update,否則只執(zhí)行pod install
- 1.4、pod search xxxx
- 檢索第三方框架
- 內(nèi)部做的事情:從本地緩存的‘第三方框架描述信息’(.json)生成的檢索文件中檢索到相關(guān)框架信息
- 常見問題:檢索不到,刪除cocopods索引文件,rm ~/Library/Cache/...search_index.json
- 搜索失敗及解決
[!] Unable to find a pod with name, author, summary, or description matchingLeeButtonLayout
1、刪除search_index.json
2、執(zhí)行如下代碼
pod repo remove master
cd ~/.cocoapods/repos
git clone --depth 1 https://github.com/CocoaPods/Specs.git master
rm ~/Library/Caches/CocoaPods/search_index.json
pod search LeeButtonLayout
- 1.5、pod setup
將遠(yuǎn)程索引庫克隆到本地索引庫
- 1.6、名詞解釋
- 遠(yuǎn)程索引庫:https://github.com/CocoaPods/Specs
- 本地索引庫:/Users/qiangzhi/.cocoapods/repos/master/Specs
- 本地索引庫檢索文件:/Users/qiangzhi/Library/Caches/CocoaPods/search_index.json
第三方源碼,第二次安裝特別快,就是因?yàn)橐呀?jīng)緩存到本地了,位置(/Users/qiangzhi/Library/Caches/CocoaPods/Pods)
如果刪除search_index.json索引文件后,執(zhí)行pod search xx 會重新生成search_index.json,需要幾分鐘

二、pod庫的制作(以制作LeeButtonLayout為例)

制作步驟
- 從模版庫創(chuàng)建工程 (pod lib create LeeButtonLayout)
- 將代碼添加到 Classes 文件夾中
- 修改.podspec配置文件
- 將代碼上傳到GitHub遠(yuǎn)程倉庫,并且打好標(biāo)簽
- pod驗(yàn)證
- 將.podspec文件發(fā)布到公有庫中(trunk方式)
- 更新本地pod第三方框架信息數(shù)據(jù)源
- 2.1、從模版庫創(chuàng)建工程
// 創(chuàng)建一個文件夾(例:remoteLib),從終端進(jìn)入,執(zhí)行以下命令,LeeButtonLayout就是庫的名稱
pod lib create LeeButtonLayout
// 你想在什么平臺使用??(由于是制作移動端的庫,所以輸入iOS)
What platform do you want to use?? [ iOS / macOS ]
> iOS
// 你想使用什么語言??(我制作的庫是使用ObjectC開發(fā),所以輸入ObjC)
What language do you want to use?? [ Swift / ObjC ]
> ObjC
// 您想在庫中包含演示應(yīng)用程序嗎?(輸入Yes,制作完成時會自動創(chuàng)建一個Example文件,里面是使用demo)
Would you like to include a demo application with your library? [ Yes / No ]
> Yes
// 您將使用哪些測試框架?(暫無)
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
// 你想做基于視圖的測試嗎?(暫無)
Would you like to do view based testing? [ Yes / No ]
> No
// 類前綴
What is your class prefix?
> Lee
??過程如下圖所示





回到Example文件夾下,執(zhí)行pod install,進(jìn)行代碼測試
- 2.2、修改.podspec配置文件

- 2.3、將代碼上傳到GitHub遠(yuǎn)程倉庫,并且打好標(biāo)簽
// 1、在github上創(chuàng)建好遠(yuǎn)程倉庫,拿到遠(yuǎn)程倉庫地址
// 2、初始化git、并關(guān)聯(lián)推送到遠(yuǎn)程倉庫
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git init
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git add .
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git commit -m "first commit"
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git branch -M master
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git remote add origin https://github.com/leeqiangzi/LeeButtonLayout.git
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git push -u origin master
// 3、添加tag并推送到遠(yuǎn)程倉庫
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git tag '0.1.0'
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % git push --tags
??GitHub密碼驗(yàn)證的支持在2021年8月13日之后就不支持了,需要配置ssh/token,可參考-《筆記-關(guān)于GitHub的操作》
- 2.4、pod驗(yàn)證(本地+遠(yuǎn)程)
// 驗(yàn)證本地庫
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod lib lint
// 驗(yàn)證遠(yuǎn)程庫
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod spec lint
二者主要區(qū)別:本地驗(yàn)證,不會驗(yàn)證tag


// 1、注冊賬戶(郵箱+姓名+描述)
- pod trunk register 601623654@qq.com 'leeqiangzi' --description='LeeButtonLayout的配置文件'
// 2、打開郵箱,通過郵件內(nèi)容驗(yàn)證section
// 3、推送到遠(yuǎn)程
- pod trunk push LeeButtonLayout.podspec
執(zhí)行結(jié)果
// 執(zhí)行打印結(jié)果
Updating spec repo `trunk` // 這一步在更新本地索引庫
Validating podspec
-> LeeButtonLayout (0.1.0)
- NOTE | xcodebuild: note: Using new build system
- NOTE | xcodebuild: note: Using codesigning identity override: -
- NOTE | xcodebuild: note: Build preparation complete
- NOTE | [iOS] xcodebuild: note: Planning
- NOTE | [iOS] xcodebuild: note: Building targets in dependency order
Updating spec repo `trunk`
--------------------------------------------------------------------------------
?? Congrats
?? LeeButtonLayout (0.1.0) successfully published
?? January 31st, 05:38
?? https://cocoapods.org/pods/LeeButtonLayout
?? Tell your friends!
--------------------------------------------------------------------------------
查看自己是否注冊過trunk
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod trunk me
- Name: leeqiangzi
- Email: 601623654@qq.com
- Since: January 31st, 05:33
- Pods:
- LeeButtonLayout
- Sessions:
- January 31st, 05:33 - June 8th, 18:59. IP: 43.239.85.131 Description:
LeeButtonLayout的配置文件
- 2.6、pod升級(子庫拆分+依賴)
pod升級過程
1、修改升級代碼,提交到遠(yuǎn)程倉庫,更新tag
2、修改spec文件,trunk方式提交


// 升級結(jié)果
qiangzhi@qiangzhideMacBook-Pro LeeButtonLayout % pod trunk push LeeButtonLayout.podspec
Updating spec repo `trunk`
Validating podspec
-> LeeButtonLayout (0.2.0)
- NOTE | xcodebuild: note: Using new build system
- NOTE | xcodebuild: note: Using codesigning identity override: -
- NOTE | xcodebuild: note: Build preparation complete
- NOTE | [iOS] xcodebuild: note: Planning
- NOTE | [iOS] xcodebuild: note: Building targets in dependency order
- NOTE | [iOS] xcodebuild: Pods.xcodeproj: warning: The iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 15.2.99. (in target 'AFNetworking' from project 'Pods')
- NOTE | [iOS] xcodebuild: Pods.xcodeproj: warning: MobileCoreServices has been renamed. Use CoreServices instead. (in target 'AFNetworking' from project 'Pods')
Updating spec repo `trunk`
--------------------------------------------------------------------------------
?? Congrats
?? LeeButtonLayout (0.2.0) successfully published
?? February 6th, 03:40
?? https://cocoapods.org/pods/LeeButtonLayout
?? Tell your friends!
--------------------------------------------------------------------------------
三、遠(yuǎn)程私有庫

與發(fā)布到pod上的主要區(qū)別
1、需要兩個遠(yuǎn)程倉庫(代碼倉庫 + spec倉庫)
2、需要配置源路徑,Podfile需要添加 source 'xxx'
3、推送配置文件使用pod repo push xxx xxx.podspec,不再使用trunk方式其他步驟與 ‘二、pod庫的制作’ 基本一致,此方法一般用于公司內(nèi)部組件化開發(fā)使用
- 3.1、創(chuàng)建遠(yuǎn)程代碼倉庫 + 遠(yuǎn)程配置倉庫

- 3.2、從模版庫創(chuàng)建工程

- 3.3、將代碼添加到Classes文件中

- 3.4、在Example文件夾下執(zhí)行pod install,進(jìn)行代碼編譯測試
-
3.5、修改spec配置文件
WechatIMG245.jpeg
- 3.6、將代碼提交到遠(yuǎn)程倉庫,添加tag
// 初始化git、關(guān)聯(lián)遠(yuǎn)程倉庫、推送代碼
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git init
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git add .
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git commit -m 'first commit'
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git remote add origin https://e.coding.net/leeqiangzi/PrivatePods/LeeLimitInput.git
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git push origin master
// 添加標(biāo)簽并推送
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git tag '0.1.0'
qiangzhi@qiangzhideMacBook-Pro LeeLimitInput % git push --tags
- 3.7、驗(yàn)證(本地+遠(yuǎn)程)


- 3.8、推送配置文件
1、添加源地址
pod repo add LeeLimitInput https://e.coding.net/leeqiangzi/PrivatePods/LeeLimitInputSpecs.git
2、將spec推送到遠(yuǎn)程
pod repo push LeeLimitInput LeeLimitInput.podspec
??如果名稱寫錯可通過 pod repo remove xxx 刪除


- 3.9、修改Podfile(添加source),執(zhí)行pod install
# 如果不添加source,則直接到pod的master中查找
# 通過pod repo查看source
source 'https://e.coding.net/leeqiangzi/PrivatePods/LeeLimitInputSpecs.git'
# 公有庫源添加
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
target 'PodUsageDemo' do
use_frameworks!
pod 'LeeLimitInput'
end
