序:
對(duì)于 Cocoapods济似,你是否還只知道 pod install,pod update盏缤,有時(shí)候還會(huì)摻雜上 pod search砰蠢, pod setup等,對(duì)于它的工作流程都不是很熟悉唉铜,又或許你在搞組件化台舱,但是對(duì)于pod庫的制作流程有些記不清,可以瀏覽瀏覽
說來慚愧潭流,2015年底參加工作的時(shí)候竞惋,我的小組長(zhǎng)告訴我有一個(gè)管理第三方的工具,啥配置都不用管灰嫉,拉下來就用拆宛,升級(jí)一個(gè)命令就行...
離職之后在另外兩家公司都沒有使用,我對(duì) Cocoapods 的感覺讼撒,好像什么都知道浑厚,又好像什么都不知道,跳槽到58后發(fā)現(xiàn)這邊在搞組件化用到了根盒,重新整理一下
目錄
- 一钳幅、Cocopods流程及使用
- 二、pod庫的制作
- 三炎滞、pod私有庫的制作(一般用于組件化)
一贡这、Cocopods流程及使用
作用:管理Xcode依賴的第三方框架
手動(dòng)管理:
1、有可能會(huì)添加很多配置及系統(tǒng)依賴框架厂榛,繁瑣易錯(cuò);
2丽惭、如果框架升級(jí)了击奶,需要替換本地工程里面的框架,再重新配置责掏。Cocopods管理:
快速柜砾、自動(dòng)集成第三方框架,并編譯成一個(gè)libPod.a的靜態(tài)庫在項(xiàng)目中使用换衬。
- 1.1痰驱、快速集成+簡(jiǎn)單使用
// 1证芭、初始化pod(會(huì)自動(dòng)生成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ī)范,描述了一個(gè)或多個(gè) 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 還有一個(gè)樂觀運(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孙援、使用本地文件夾路徑(通常用于本地庫,一般建議采用相對(duì)路徑解滓,避免重新配置)
pod 'AFNetworking', :path => '~/Documents/AFNetworking' # 絕對(duì)路徑
pod 'AFNetworking', :path => '../AFNetworking' # 相對(duì)路徑
// 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'
何時(shí)使用
pod install :添加邻辉、刪除pod的時(shí)候(即使工程中已經(jīng)存在Podfile或者已經(jīng)執(zhí)行過pod install)
pod update [#PODNAME] :僅在要將pod 更新到較新版本時(shí)使用主要區(qū)別場(chǎng)景
在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時(shí)值骇、每次編輯Podfile文件(新增、移除移国、更新)時(shí)使用吱瘩;
- 每次執(zhí)行pod install時(shí),除了下載安裝迹缀,還會(huì)在Podfile.lock文件夾中生成版本信息使碾,用于跟蹤和鎖定該版本;
- Podfile.lock祝懂,在第一次運(yùn)行pod install后生成的票摇,記錄每個(gè)安裝庫的版本號(hào),并且鎖定了這些版本砚蓬;
- 對(duì)于在Podfile.lock中記錄的版本矢门,該命令會(huì)直接下載安裝,不會(huì)去檢查是否有新的版本;
- 對(duì)于不在Podfile.lock里面的庫祟剔,執(zhí)行該命令后會(huì)從Podfile文件的信息中查找對(duì)應(yīng)版本隔躲。
2、pod update
- pod update參照Podfile安裝物延,如果Podfile中沒有做版本限制宣旱,會(huì)直接將第三方庫升級(jí)為最新的
- 只關(guān)心Podfile中的版本限制,不考慮Podfile.lock里面的限制
- 如果只運(yùn)行pod update教届,后面沒有跟庫的名字响鹃,CocoaPods就會(huì)更新Podfile里面所有的庫到最新版本
3、pod outdated
- 會(huì)列出所有較Podfile.lock里面有新版本的庫(一般用于更新前檢查)
4案训、提升安裝速度
輸入pod install或者pod update之后买置,
- CocoaPods首先會(huì)去匹配本地spec庫;
- 在確認(rèn)spec庫不需要更新之后强霎,才會(huì)下載相應(yīng)的庫文件忿项;
- 這樣比較耗時(shí),可使用以下命令城舞,跳過spec版本庫更新匹配
pod update --verbose --no-repo-update
pod install --verbose --no-repo-update
5轩触、約定俗稱的規(guī)則
- 提交代碼時(shí),省略Pod文件家夺,其他人克隆源碼后直接執(zhí)行pod install脱柱,可節(jié)省遠(yuǎn)程倉庫存儲(chǔ)空間
- 一般添加pod的時(shí)候都會(huì)指明版本(防止其他人誤更新)
- 關(guān)于升級(jí):除非組內(nèi)一起升級(jí),保持版本同步才會(huì)執(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 會(huì)重新生成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)建一個(gè)文件夾(例:remoteLib)靶草,從終端進(jìn)入,執(zhí)行以下命令岳遥,LeeButtonLayout就是庫的名稱
pod lib create LeeButtonLayout
// 你想在什么平臺(tái)使用奕翔??(由于是制作移動(dòng)端的庫浩蓉,所以輸入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懂酱,制作完成時(shí)會(huì)自動(dòng)創(chuàng)建一個(gè)Example文件叉弦,里面是使用demo)
Would you like to include a demo application with your library? [ Yes / No ]
> Yes
// 您將使用哪些測(cè)試框架渠欺?(暫無)
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
// 你想做基于視圖的測(cè)試嗎搏嗡?(暫無)
Would you like to do view based testing? [ Yes / No ]
> No
// 類前綴
What is your class prefix?
> Lee
??過程如下圖所示
回到Example文件夾下震放,執(zhí)行pod install码倦,進(jìn)行代碼測(cè)試
- 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)證兔魂,不會(huì)驗(yàn)證tag
// 1、注冊(cè)賬戶(郵箱+姓名+描述)
- 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!
--------------------------------------------------------------------------------
查看自己是否注冊(cè)過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升級(jí)(子庫拆分+依賴)
pod升級(jí)過程
1遂唧、修改升級(jí)代碼,提交到遠(yuǎn)程倉庫吊奢,更新tag
2盖彭、修改spec文件,trunk方式提交
// 升級(jí)結(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召边、需要兩個(gè)遠(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)行代碼編譯測(cè)試
-
3.5父丰、修改spec配置文件
- 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
??如果名稱寫錯(cuò)可通過 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