CocoaPods簡(jiǎn)介
CocoaPods
是專(zhuān)門(mén)為 iOS
工程提供第三方依賴(lài)庫(kù)的管理工具调榄,通過(guò) CocoaPods
,我們可以更方便地管理每個(gè)第三方庫(kù)的版本涣澡,而且不需要我們做太多的配置态贤,就可以直觀、集中和自動(dòng)化地管理我們項(xiàng)目的第三方庫(kù)梁剔。
CocoaPods
將所有依賴(lài)的庫(kù)都放在一個(gè)名為 Pods
的項(xiàng)目下,然后讓主項(xiàng)目依賴(lài) Pods
項(xiàng)目舞蔽。然后荣病,我們編碼工作都從主項(xiàng)目轉(zhuǎn)移到 Pods
項(xiàng)目。Pods
項(xiàng)目最終會(huì)編譯為一個(gè) libPod-項(xiàng)目名.a
靜態(tài)庫(kù)渗柿,主項(xiàng)目依賴(lài)于這個(gè)靜態(tài)庫(kù)个盆。
對(duì)于資源文件脖岛,CocoaPods
提供了一個(gè)名為 Pods-resources.sh
的 bash
腳本,該腳本在每次項(xiàng)目編譯的時(shí)候都會(huì)執(zhí)行颊亮,將第三方庫(kù)的各種資源文件復(fù)制到目標(biāo)目錄中柴梆。CocoaPods
通過(guò)一個(gè)名為 Pods.xcconfig
的文件來(lái)在編譯時(shí)設(shè)置所有的依賴(lài)和參數(shù)。CocoaPods
是用 Ruby
寫(xiě)的终惑,并由若干個(gè) Ruby
包 (gems) 構(gòu)成的绍在。在解析整合過(guò)程中,最重要的幾個(gè) gems
分別是: CocoaPods/CocoaPods雹有、CocoaPods/Core 和 CocoaPods/Xcodeproj偿渡。
CocoaPod的核心組件
- CocoaPods/CocoaPod
這是一個(gè)面向用戶(hù)的組件,每當(dāng)執(zhí)行一個(gè)pod
命令時(shí)霸奕,這個(gè)組件都將被激活溜宽。該組件包括了所有使用CocoaPods
涉及到的功能,并且還能通過(guò)調(diào)用所有其它的gems
來(lái)執(zhí)行任務(wù)质帅。 - CocoaPods/Core
Core
組件提供支持與CocoaPods
相關(guān)文件的處理适揉,文件主要是Podfile
和podspecs
。 - Podfile
Podfile
是一個(gè)文件临梗,用于定義項(xiàng)目所需要使用的第三方庫(kù)涡扼。該文件支持高度定制,你可以根據(jù)個(gè)人喜好對(duì)其做出定制盟庞。更多相關(guān)信息,請(qǐng)查閱Podfile
指南汤善。 - Podspec
.podspec
也是一個(gè)文件什猖,該文件描述了一個(gè)庫(kù)是怎樣被添加到工程中的。它支持的功能有:列出源文件红淡、framework
不狮、編譯選項(xiàng)和某個(gè)庫(kù)所需要的依賴(lài)等。 - CocoaPods/Xcodeproj
這個(gè)gem
組件負(fù)責(zé)所有工程文件的整合在旱。它能夠創(chuàng)建并修改.xcodeproj
和.xcworkspace
文件摇零。它也可以作為單獨(dú)的一個(gè)gem
包使用。如果你想要寫(xiě)一個(gè)腳本來(lái)方便地修改工程文件桶蝎,那么可以使用這個(gè)gem
驻仅。
私有庫(kù)開(kāi)發(fā)流程
一般公司都會(huì)搭建自己的 git
服務(wù)器,在實(shí)戰(zhàn)項(xiàng)目中登渣,經(jīng)常使用 Cocoapods
管理自己的私有庫(kù)噪服。
-
git
倉(cāng)庫(kù)至少需要兩個(gè),一個(gè)用于管理私有庫(kù)對(duì)應(yīng)版本的podspec
文件胜茧,一個(gè)用于存放私有庫(kù)的源文件粘优。 - 查看現(xiàn)有的
podspec
源地址:
cd ~/.cocoapods/repos
創(chuàng)建一個(gè)私有的 podspec
主要包括如下幾步:
- 創(chuàng)建一個(gè)私有的
Spec Repo
,用于管理私有庫(kù)對(duì)應(yīng)版本的podspec
文件; - 創(chuàng)建
pod
私有庫(kù)所需要的項(xiàng)目工程文件雹顺,并上傳到私有庫(kù)丹墨; - 創(chuàng)建
pod
所對(duì)應(yīng)的podspec
文件,并進(jìn)行驗(yàn)證/測(cè)試嬉愧; - 向私有的
Spec Repo
中提交podspec
贩挣; - 使用
pod
庫(kù);
創(chuàng)建一個(gè)私有的 Spec Repo
- 在自己公司的
git
服務(wù)器上創(chuàng)建SpecsRepo
倉(cāng)庫(kù)英染; - 將私有
SpecsRepo
關(guān)聯(lián)到本地揽惹;
pod repo add IMXSpecsRepo http://192.168.120.32/app/sisi-iOS/IMXSpecsRepo.git
查看 SpecsRepo
是否創(chuàng)建成功
cd ~/.cocoapods/repos
創(chuàng)建 pod 私有庫(kù)所需要的項(xiàng)目工程
命令行創(chuàng)建
pod lib create 倉(cāng)庫(kù)名字 --template-url=http://192.168.120.32/app/sisi-iOS/IMXPodTemplte
手動(dòng)創(chuàng)建
手動(dòng)創(chuàng)建 Xcode
工程項(xiàng)目,創(chuàng)建 podspec
文件
pod spec create XXXX.podspec
修改 podspec
文件
Pod::Spec.new do |s|
s.name = 'AKCBrowser'
s.version = '0.0.1'
s.summary = 'A short description of AKCBrowser.'
# This description is used to generate tags and improve search results.
# * Think: What does it do? Why did you write it? What is the focus?
# * Try to keep it short, snappy and to the point.
# * Write the description between the DESC delimiters below.
# * Finally, don't worry about the indent, CocoaPods strips it!
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'http://192.168.120.32/app/akc-framework-ios/AKCBrowser.git'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'sunjinshuai' => 's_mike@163.com' }
s.source = { :git => 'http://192.168.120.32/app/akc-framework-ios/AKCBrowser.git', :tag => s.version.to_s }
s.static_framework = true
s.requires_arc = true
s.frameworks = 'UIKit', 'Foundation'
s.ios.deployment_target = '8.0'
s.xcconfig = {
'GCC_PREPROCESSOR_DEFINITIONS' => 'MAS_SHORTHAND_GLOBALS=1'
}
s.resource_bundles = {
'Browser' => ['AKCBrowser/Assets/Browser/*.*']
}
s.source_files = 'AKCBrowser/Classes/**/*'
s.dependency 'SDWebImage','4.2.3'
s.dependency 'YYImage'
s.dependency 'AKCFoundation'
s.dependency 'AFNetworking/Reachability'
s.dependency 'SVProgressHUD'
s.dependency 'AKCLog'
end
podspec 語(yǔ)法簡(jiǎn)介
s.name:私有庫(kù)的名稱(chēng)四康,`pod search`搜索的關(guān)鍵詞搪搏,注意這里一定要和`.podspec`的名稱(chēng)一樣,否則報(bào)錯(cuò)闪金。
s.version:私有庫(kù)的版本疯溺。
s.ios.deployment_target:支持的pod最低版本。
s.summary:私有庫(kù)簡(jiǎn)介哎垦。
s.description:私有庫(kù)詳細(xì)介紹囱嫩。
s.homepage:私有庫(kù)在GitHub上的地址。
s.license:開(kāi)源協(xié)議漏设。
s.author:作者墨闲。
s.social_media_url:社交網(wǎng)址,你的podspec發(fā)布成功后會(huì)@你
s.source:私有庫(kù)在GitHub上的地址和版本號(hào)郑口。
s.source_files:私有庫(kù)對(duì)外共享的.h和.m文件鸳碧。
s.requires_arc:是否支持ARC。
更多語(yǔ)法查看(http://guides.cocoapods.org/making/specs-and-specs-repo.html)
上傳項(xiàng)目工程的源文件
git add -A
git commit -m "first commit"
git remote add origin http://192.168.120.32/app/akc-framework-ios/AKCBrowser.git
git push -u origin master
git tag -m "first release" 0.0.1
git push --tags #推送tag到遠(yuǎn)端倉(cāng)庫(kù)
驗(yàn)證 podspec 文件
pod lib lint --allow-warnings --verbose
pod lib lint --use-libraries --allow-warnings // 使用靜態(tài)庫(kù)后的用法
pod lib lint --sources=http://192.168.120.32/app/sisi-iOS/IMXSpecsRepo.git
當(dāng)看到 AKCBrowser passed validation
犬性。表示驗(yàn)證通過(guò)瞻离。
向 Spec Repo 中提交 podspec 文件
# 如果依賴(lài)其他私有源 同樣需要加上 --sources 參數(shù)
pod repo push IMXSpecsRepo AKCFoundation.podspec --allow-warnings
pod repo push IMXSpecsRepo AKCProtobuf.podspec --allow-warnings --use-libraries // 使用靜態(tài)庫(kù)后的用法
pod repo push IMXSpecsRepo AKCFoundation.podspec --allow-warnings --sources='http://192.168.120.32/ddcang/iOSGiftBox/SpecsRepo.git'
多 target 時(shí) Podfile 該如何寫(xiě)
platform :ios, '8.0'
def commonPods #通用pods集
pod 'AFNetworking', '~> 2.0'
pod 'Masonry'
end
def appOnlyPods #app專(zhuān)用pods集
pod 'MBProgressHUD'
end
def extensionPods #擴(kuò)展專(zhuān)用pods集
pod 'GTSDKExtension'
end
target :TestCocoaPods do
commonPods
appOnlyPods
target :TestCocoaPodsTests do
inherit! :search_paths
# Pods for testing
end
target :TestCocoaPodsUITests do
inherit! :search_paths
# Pods for testing
end
end
target :SecondTarget do
commonPods
end
如何忽略Pods警告
在 Podfile
中對(duì)應(yīng)的 target
或分組下加上關(guān)鍵字 inhibit_all_warnings
即可。
如何直接引用第三方庫(kù)中的頭文件
在用 CocoaPods
集成第三方庫(kù)之后乒裆,默認(rèn)情況下套利,我們需要使用類(lèi)似 #import <XXX/YYY.h>
的方式引入第三方庫(kù)的頭文件。
可以在 Build Settings -> User Header Search Paths
中添加 ${SRCROOT}
并設(shè)置成 recursive
鹤耍,這樣我們就可以直接使用 #impot "YYY.h"
這種方式了肉迫。
pod install 和 pod update 的選擇
pod install:
按照官方文檔所說(shuō),pod install
在第一次檢索集成第三方以及每一次在 Podfile
中新增惰蜜、更改或刪除 pod 的時(shí)候使用昂拂。每一次執(zhí)行 pod install
命令,它都會(huì)下載安裝新的 pod
抛猖,并且會(huì)把每一個(gè)安裝的 pod
的版本信息寫(xiě)入 Podfile.lock
文件格侯。Podfile.lock
文件跟蹤每一個(gè)安裝的 pod
的版本并且上鎖鼻听。每一次執(zhí)行 pod install
命令,只解決還沒(méi)有在 Podfile.lock
中列出的依賴(lài):對(duì)于已在 Podfile.lock 中列出的 pod
联四,會(huì)下載指定的版本撑碴,不會(huì)檢查是否有新版本。對(duì)于沒(méi)有在 Podfile.lock
中列出的 pod
朝墩,它會(huì)搜索并安裝 Podfile
中指定的版本醉拓。
pod update:
直接執(zhí)行 pod update
命令會(huì)檢查安裝 Podfile
中列出的所有 pod
的最新版本。只有當(dāng)你想要更新 pod
庫(kù)的版本時(shí)才使用 pod update
收苏;它不管 Podfile.lock
是否存在亿卤,都會(huì)讀取 Podfile
文件的最新版本,下載好之后鹿霸,重新生成 Podfile.lock
文件排吴。
兩者的區(qū)別:
用
pod install
命令來(lái)安裝新的pod
,每次在Podfile
中新增和刪除pod
都使用pod install
命令懦鼠。在
Podfile
中添加新的pod
后應(yīng)該用pod install
命令钻哩,而不是pod update
命令。通過(guò)pod install
命令安裝新的pod
而不用擔(dān)心在同一進(jìn)程中修改已有的pod
肛冶。pod update
命令僅用在更新指定pod
到指定版本或者更新所有pod
街氢。
如果想更新指定的 pod
倉(cāng)庫(kù),可以使用
pod update XXX –no-repo-update
如果想安裝新添加的庫(kù)
pod install –no-repo-update
當(dāng)需要在 CocoaPods
中刪除一個(gè)我們不要的庫(kù)時(shí) 可以在 Podfile
中直接刪除相關(guān)庫(kù)睦袖;
pod update --no-repo-update 會(huì)在刪除相關(guān)庫(kù)時(shí) 更新其他庫(kù)版本
pod update XXX --no-repo-update 只會(huì)刪除相關(guān)庫(kù) 和下方一致
pod install --no-repo-update 只會(huì)刪除相關(guān)庫(kù)
關(guān)于版本指定約束
一般我們?cè)谑褂?cocoapods
導(dǎo)入第三方庫(kù)前都會(huì)生成一個(gè) podfile
文件珊肃,文件中記錄著我們要導(dǎo)入的第三方庫(kù)以及對(duì)應(yīng)的版本信息,比如:
pod 'SDWebImage', '~> 4.3.2'
讓 cocoapods
導(dǎo)入 SDWbImage
馅笙,版本號(hào) 4.3.2
和版本號(hào)處于 4.3.2-4.4
之間的近范,不包括 4.4
和更高版本。
pod 'SDWebImage' --- 不指定版本延蟹,表示希望使用最新版本
pod 'SDWebImage', '4.3.2' --- 指定明確版本,表示只想要這個(gè)版本
邏輯關(guān)系
'> 0.1' --- 版本號(hào)大于0.1的
'>= 0.1' --- 版本0.1和版本號(hào)大于0.1的
'< 0.1' --- 版本號(hào)小于0.1的
'<= 0.1' --- 版本號(hào)0.1和版本號(hào)小于0.1的
最優(yōu)匹配
'~> 0.1.2' --- 版本0.1.2和版本號(hào)處于0.1.2-0.2之間的,不包括0.2和更高版本
'~> 0.1' --- 版本0.1和版本號(hào)處于0.1-1.0之間的,不包括1.0和更高版本
'~> 0' --- 版本0和更高叶堆,和沒(méi)設(shè)沒(méi)啥區(qū)
tag 改動(dòng)原則:
- 增加 api阱飘,修改第三位;
- 修改 api,修改第二位虱颗;
- 大版本變更修改第一位;