前段時間結合自己平時的學習研究做了一個有關pods的內部分享伊磺,接下來會把相關資料以文字的形式分享出來,預估是一個pods系列酒奶,希望能較為全面的將其相關知識點與實踐運用呈現出來蚁孔,也希望和大家多多交流。話不多說惋嚎,那我們就即刻出發(fā)吧杠氢!
pod系列文章
Cocoapods,讓iOS開發(fā)更簡單(一):走近Cocoapods
Cocoapods另伍,讓iOS開發(fā)更簡單(二):創(chuàng)建私有庫
Cocoapods鼻百,讓iOS開發(fā)更簡單(三):實踐經驗匯總
一文帶你快速分清靜態(tài)庫-動態(tài)庫-Framework
是什么
CocoaPods是OS和iOS平臺上的一個第三方依賴庫管理工具,通過它我們可以更加
高效的
依賴并管理被稱為“Pods”的庫摆尝。在iOS開發(fā)中愕宋,現在的Cocoapods已經是事實上的添加第三方庫的標準方式了。
它擁有超過49,000個第三方庫结榄,超過3,000,000個app都在使用CocoaPods做依賴管理,CocoaPods可以幫助你優(yōu)雅的擴展你的項目囤捻。
為什么使用它
在iOS開發(fā)項目中臼朗,經常會使用第三方庫,手動引入流程復雜,并且?guī)熘g存在依賴關系视哑,手動管理較繁瑣绣否。但采用CocoaPods,安裝和升級都只是一句命令的事情挡毅,讓開發(fā)者可專注于業(yè)務本身蒜撮。
方便:方便查找、依賴跪呈、管理和更新第三方庫段磨,同時方便了工程調試和階段性開發(fā);
規(guī)范:庫的使用及創(chuàng)建都要符合標準耗绿;
直觀:對于庫的創(chuàng)建和使用都清晰明了的按格式有標注苹支;
集中:庫及項目中都有指定的文件進行相應的管理;
自動化:在引入第三方庫時可以做到自動為項目完成各種各樣的配置误阻,包括配置編譯階段债蜜、連接器選項、甚至是ARC環(huán)境下的-fno-objc-arc配置等究反;
它是怎么起作用的
CocoaPods是用 Ruby 寫的寻定,并由若干個 Ruby 包 (gems) 構成的。核心組件gems 分別是: CocoaPods/CocoaPods精耐、CocoaPods/Core和 CocoaPods/Xcodeproj狼速。
CocoaPods/CocoaPod
這是一個面向用戶的組件,每當執(zhí)行一個 pod 命令時黍氮,這個組件都將被激活唐含。該組件包括了所有使用 CocoaPods 涉及到的功能,并且還能通過調用所有其它的 gems 來執(zhí)行任務沫浆。CocoaPods/Core
Core 組件提供支持與 CocoaPods 相關文件的處理捷枯,文件主要是 podfile 和 podspec。CocoaPods/Xcodeproj
這個 gem 組件負責所有工程文件的整合专执。它能夠創(chuàng)建并修改 .xcodeproj 和 .xcworkspace 文件淮捆。
基于以上核心組件,實現:
- 自動化配置:通過一個名為 Pods.xcconfig 的文件來在編譯時設置所有的依賴和參數本股。
- 管理資源文件:CocoaPods 提供了一個名為 Pods-resources.sh 的 bash 腳本攀痊,該腳本在每次項目編譯的時候都會執(zhí)行,將第三方庫的各種資源文件復制到目標目錄中拄显。
- 依賴管理:CocoaPods將所有依賴的庫都放在一個名為Pods的項目下苟径,然后讓主項目依賴Pods項目,Pods項目最終會編譯為一個libPod-項目名.a靜態(tài)庫(Pods_xxx.framework)躬审,主項目依賴于該庫棘街。
Spec Repo
Spec Repo是所有的Pods的一個索引蟆盐,可以理解為是一個容器。對于公有的Spec Repo遭殉,所有公開的Pods都通過這個庫進行索引石挂,其實際是GitHub上的一個Git倉庫。當開發(fā)者使用了CocoaPods后會被clone到本地的~/.cocoapods/repos目錄下险污,可以進入到這個目錄看到master文件夾就是這個官方的Spec Repo痹愚,目錄的結構為:
├── Specs
└── [SPEC_NAME]
└── [VERSION]
└── [SPEC_NAME].podspec
如何用
安裝Cocoapods環(huán)境
CocaPods的安裝在ruby環(huán)境上通過Gem 安裝,具體安裝步驟不贅述蛔糯。
//安裝CocoaPods
sudo gem install cocoapods
#sudo gem install -n /usr/local/bin cocoapods
pod setup
podSpec文件
podSpec文件可以理解為一個庫的信息簡介和說明書拯腮,支持列出源文件、framework渤闷、編譯選項和某個庫所需要的依賴等疾瓮。
podspec文件是一個Ruby的文件,示例:
Pod::Spec.new do |s|
s.name = "PodTestLibrary" #名稱
s.version = "0.1.0" #版本號
s.summary = "Just Testing." #簡短介紹飒箭,下面是詳細介紹
s.description = <<-DESC
Testing Private Podspec.
DESC
s.homepage = "https://github.com/hello/PodTestLibrary"
#主頁,這里要填寫可以訪問到的地址狼电,不然驗證不通過
s.license = 'MIT' #開源協(xié)議
s.author = { "hello" => "hello@good.com" } #作者信息
s.source = { :git => "https://github.com/hello/PodTestLibrary.git", :tag => "0.0.1" }
#項目地址,支持HTTP和HTTPS弦蹂,最好使用HTTPS
s.platform = :ios, '7.0' #支持的平臺及最低版本
s.source_files = 'Pod/Classes/**/*'
#代碼源文件地址肩碟,如果有多個目錄下則用逗號分開,目錄指定了pod install下載的內容
s.resource_bundles = {
'PodTestLibrary' => ['Pod/Assets/*.png']
} #資源文件地址
s.public_header_files = 'Pod/Classes/**/*.h' #公開頭文件地址
s.frameworks = 'UIKit' #所需的framework凸椿,多個用逗號隔開
s.dependency 'AFNetworking', '~> 2.3'
#依賴關系削祈,該項目所依賴的其他庫,如果有多個需要填寫多個s.dependency
end
subspec
subspec模板:
s.subspec '子模塊名稱' do |別名脑漫,不能和子模塊名稱相同髓抑,比如ss|
ss.source_files = ''
end
subspec示例:
Pod::Spec.new do |s|
s.name = "PodTestLibrary"
s.version = "1.0.0"
s.summary = "Just Testing."
s.description = <<-DESC
Testing Private Podspec.
* Markdown format.
DESC
s.homepage = "https://github.com/hello/PodTestLibrary"
s.license = 'MIT'
s.author = { "hello" => "hello@good.com" }
s.source = { :git => "https://github.com/hello/PodTestLibrary.git", :tag => "1.0.0" }
s.platform = :ios, '7.0'
#s.source_files = 'Pod/Classes/**/*'
#s.resource_bundles = {
# 'PodTestLibrary' => ['Pod/Assets/*.png']
#}
#s.public_header_files = 'Pod/Classes/**/*.h'
s.subspec 'NetWorkEngine' do |networkEngine|
networkEngine.source_files = 'Pod/Classes/NetworkEngine/**/*'
networkEngine.public_header_files = 'Pod/Classes/NetworkEngine/**/*.h'
networkEngine.dependency 'AFNetworking', '~> 2.3'
end
s.subspec 'CommonTools' do |commonTools|
commonTools.source_files = 'Pod/Classes/CommonTools/**/*'
commonTools.public_header_files = 'Pod/Classes/CommonTools/**/*.h'
commonTools.dependency 'OpenUDID', '~> 1.0.0'
commonTools.dependency 'NetWorkEngine'
end
s.frameworks = 'UIKit'
end
原項目整體的依賴dependency、源文件source_files优幸、頭文件public_header_files和資源文件resource等都移動到了各自的subspec中吨拍,每個subspec之間也可以有相互的依賴關系,比如CommonTools就依賴于NetWorkEngine网杆。
在podSpec中建立subspec羹饰,有以下作用:
- pod依賴文件劃分在不同的目錄結構下;
- 實現按需依賴碳却;
Podfile文件
Podfile 文件用于定義項目所需要使用的第三方庫以及項目的基本配置队秩。舉例如下:
source 'https://github.com/CocoaPods/Specs.git' # 官方庫源
source 'https://gitlab.corp.ttt.com:hello/PodTestSpec.git' # 私有庫源
platform :ios, '7.0'
pod 'PodTestLibrary/NetWorkEngine', '1.0.0' #依賴某一個部分
pod 'PodTestLibrary', '1.0.0' #使用整個庫
管理依賴庫版本號
- 不指定任何版本號,舉例為:
pod 'AFNetworking'
- 指定固定的版本號昼浦,舉例:
pod 'AFNetworking', '1.0' // 版本號指定為1.0
還有一些靈活的依賴用法馍资,會在同系列后續(xù)文章專門板塊中介紹,敬請關注关噪。
Podfile.lock文件
Podfile.lock文件跟蹤最后一次更新pods以保存所有第三方庫的版本號鸟蟹。
Pods目錄
保存通過pod install 或 pod update下載下來的第三方庫的代碼物舒。
xxx.xcworkspace文件
接入CocoaPods后重新生成的一個工作空間,打開該文件進行開發(fā)戏锹。
常用命令
常用命令有:
pod --help:可以查看pod可以使用的命令;
pod repo list: 查看本地spec倉庫列表火诸;
pod init:項目pod初始化锦针,創(chuàng)建默認的Podfile文件;
pod install:安裝pods庫置蜀;
pod install --no-repo-update:安裝框架奈搜,不更新本地索引,不會升級本地代碼庫盯荤;
pod update:升級馋吗、添加、刪除框架秋秤;
pod update --no-repo-update:更新框架宏粤,不更新本地索引,可安裝框架或刪除不用的框架灼卢,但不會升級安裝已安裝的框架绍哎;
pod list:列出項目中所有依賴的庫;
pod repo update:從遠程倉庫更新本地spec repo倉庫鞋真;
哪些地方可以用
依賴公共庫
pod 'AFNetworking', '~> 0.1.5'
依賴私有庫
pod 'PodTestLibrary', '~> 0.1.0'
如果我們同時使用了公有庫和私有庫崇堰,我們只需要在Podfile的頭部同時把公有庫和私有庫的source加上即可。
創(chuàng)建私有庫
下面會在本系列中專門出一個創(chuàng)建私有庫的文章涩咖,大家敬請期待吧海诲。
創(chuàng)建公有庫
如果要添加到Cocoapods的官方庫了,可以使用trunk工具檩互,具體可以查看官方文檔
在 guides.cocoapods里面有一個 Getting setup with Trunk特幔,注冊 trunk,它的作用是能夠讓我們把本地的 spec 文件上傳到 gitHub的遠程索引庫盾似,發(fā)布自己的代碼到Cocoapods供廣大開發(fā)者使用敬辣。