以前只會pod install....
有必要搞清楚cocoaPods到底在干嘛蹭沛。
CocoaPods是開發(fā) OS X 和 iOS 應用程序的一個第三方庫的依賴管理工具袁铐。利用CocoaPods嗜侮,可以定義自己的依賴關系(稱作pods)芹缔。
cocoaPods為我們做了兩件事:
1>在工程中引入第三方代碼會涉及到的工程文件的配置蚌堵,build phases和linker flags亏钩,它能自動配置編譯選項剑肯。
2>通過CocoaPods捧毛,可以很方便的查找到新的第三方庫。
CocoaPods是一個objc的依賴管理工具,而其本身是利用ruby的依賴管理gem進行構建的呀忧。
Cocoapods是用ruby寫的师痕,并由若干個ruby包(gems)構成的。在解析整合過程中而账,最重要的幾個gems分別是:
CocoaPods/CocoaPods ,
CocoaPods/Core,
CocoaPods/Xcodeproj
分別看下這幾個gems干了什么事兒
CocoaPods/CocoaPods
這是一個面向用戶的組件胰坟,每當執(zhí)行一個pod命令時,這個組件都將被激活福扬。該組件包括了所有使用CocoaPods涉及到的功能腕铸,并且還能通過調用所有其他的gems來執(zhí)行任務。
CocoaPods/Core
Core組件提供支持與CocoaPods相關文件的處理铛碑,文件主要是Podfile和podspecs狠裹。
podfile:是一個文件,用于定義項目所需要使用的第三方庫汽烦。該文件支持高度定制涛菠。
podspec:.podspec也是一個文件,該文件描述了一個庫是怎樣被添加到工程中的撇吞。它支持的功能有:列出源文件俗冻、framework、編譯選項和某個庫所需要的依賴等牍颈。
CocoaPods的安裝
MAC下自帶ruby迄薄,使用ruby的gem命令即可下載安裝:
sudo gem install cocoapods
pod setup
如果gem比較老,可以試試升級gem:
sudo gem update --system
另外煮岁,ruby的軟件源 https://rubygems.org 因為使用的是亞馬遜的云服務讥蔽,所以被墻了,需要更新一下ruby的源画机,將官方的ruby源替換成國內淘寶的源:
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/
gem sources -l
CocoaPods的鏡像索引
所有的項目的Podspec文件都托管在https://github.com/CocoaPods/Specs冶伞。第一次執(zhí)行pod setup時,CocoaPods會將這些podspec索引文件更新到本地的~/.cocoapods/目錄下步氏,這個索引文件比較大响禽,有80M左右,所以第一次更新時非常慢荚醒。
使用CocoaPods
使用時需要新建一個名為Podfile的文件芋类,以如下格式,將依賴的庫名字寫在該文件中:
platform :ios
pod 'JSONKit', '~> 1.4'
pod 'Reachability', '~> 3.0.0'
pod 'ASIHTTPRequest'
pod 'RegexKitLite'
然后將編輯好的Podfile文件放到你的項目根目錄中界阁,執(zhí)行如下命令即可:
pod install
現(xiàn)在你的所有第三方庫都已經下載完成并且設置好了編譯參數(shù)和依賴梗肝。
關于Podfile.lock
當你執(zhí)行pod install之后,除了Podfile外铺董,CocoaPods還會生成一個名為Podfile.lock的文件,Podfile.lock應該加入到版本控制里面,不應該把這個文件加入到.gitignore中精续。因為Podfile.lock會鎖定當前各依賴庫的版本坝锰,之后如果多次執(zhí)行pod install不會更改版本,要pod update才會改Podfile.lock了重付。這樣多人協(xié)作的時候顷级,可以防止第三方庫升級時造成大家各自的第三方庫版本不一致。
為自己的項目創(chuàng)建podspec文件:
我們可以為自己的開源項目創(chuàng)建podspec文件确垫,首先通過如下命令初始化一個podspec文件:
pod spec create your_pod_spec_name
該命令執(zhí)行之后弓颈,CocoaPods會生成一個名為your_pod_spec_name.podspec的文件,然后我們修改其中的相關內容即可删掀。
如何編寫一個CocoaPods的spec文件
為自己的項目編寫Podspec文件:
初始化一個Podspec文件:
pod spec create weibo_ios_sdk_sso-oauth
該命令將在本目錄產生一個名為weibo_ios_sdk_sso-oauth.podspec的文件。
如何聲明第三方庫的代碼目錄和資源目錄,還有該第三方庫所依賴iOS核心框架和第三方庫吭从?
podspec文件大致如下:
Pod::Spec.new do |s|
s.name = 'ADVProgressBar' //聲明庫的名稱篷牌。pod search命令就是根據(jù)s.name 和 s.summary作為搜索文本的
s.version = '0.0.1' //聲明庫源代碼的版本
s.license = 'MIT' //采取的授權版本
s.summary = 'Progress Bar Design with Percentage values.' //聲明一個簡短的說明文檔
s.homepage = 'https://github.com/appdesignvault' //聲明庫的主頁
s.author = { 'appdesignvault' => 'appdesignvault' } //庫的作者
s.source = { :git => 'https://github.com/appdesignvault/ADVProgressBar.git', :commit => 'f17b15c15574d6d101cd5fcfd58239e16e806647' } //聲明源代碼的地址。對于很多第三方庫而言款票,在發(fā)布的時候都會打上一個tag控硼,如版本0.0.1就會打上一個名為v0.0.1的tag,但是但是weibo_ios_sdk_sso-oauth庫還未打上任何tag,我們可以選擇一個最新的commit來作為該庫0.0.1版的代碼艾少。以后我們可以根據(jù)該庫不同的版本創(chuàng)建相應的pod spec文件卡乾。
s.platform = :ios
s.source_files = 'ADVProgressBar/Classes/*.{h,m}'
s.resources = "ADVProgressBar/Resources/*.png"
s.framework = 'UIKit'
s.requires_arc = true
end
weibo_ios_sdk_sso-oauth的目錄結構:
demo目錄保存一個示例項目,src才是庫的源代碼目錄缚够。src的目錄結構如下:
JSONKit目錄說明這個庫本身依賴于JSONKit第三方庫幔妨。我們可以在podspec文件中的s.dependency聲明段中聲明。
s.dependency 'JSONKit', '~>1.4'
SinaWeibo目錄才是包含了所有源代碼的目錄潮瓶,我們需要在s.source_files中聲明
s.source_files = 'src/SinaWeibo/.{h,m}'
前一部分src/SinaWeibo/是一個相對目錄陶冷,目錄的層級關系一定要跟代碼庫的保持一致。最后一部分.{h,m}是一個類似正則表達式的字符串毯辅,表示匹配所有以.h和.m為擴展名的文件埂伦。
src/SinWeibo/目錄下還有一個SinaWeibo.bundle目錄,該目錄存放一些資源文件(如圖片等)思恐,這些文件并不需要進行編譯沾谜。可以使用s.resources聲明:
s.resources = "src/SinaWeibo/SinaWeibo.bundle//.png"
前一部分跟上面相同胀莹,表示匹配所有子目錄基跑,.png表示所有以.png為擴展名的圖片文件。
weibo_ios_sdk_sso-oauth還依賴一個iOS的核心庫QuartzCore
s.framework = 'QuartzCore'
最終結果如下:
Pod::Spec.new do |s|
s.name = "weibo_ios_sdk_sso-oauth"
s.version = "0.0.1"
s.summary = 'weibo.com sso oauth, 微博sso認證登錄功能'
s.homepage = "https://github.com/mobileresearch/weibo_ios_sdk_sso-oauth"
s.license = 'MIT'
s.author = {'mobileresearch' => 'mobileresearch'}
s.source = { :git => 'https://github.com/mobileresearch/weibo_ios_sdk_sso-oauth.git', :commit => '68defea78942ecc782ffde8f8ffa747872af226d' }
s.platform = :ios
s.source_files = 'src/SinaWeibo/*.{h,m}'
s.resources = "src/SinaWeibo/SinaWeibo.bundle/**/*.png"
s.framework = 'QuartzCore'
s.dependency 'JSONKit', '~> 1.4' //
end
可以將該spec文件保存到本機的~/.cocoapods/master/目錄中僅供自己使用描焰,也可以將其提交到CocoaPods/Specs代碼庫中媳否。下面是將其保存到本機中:
$ mkdir -p ~/.cocoapods/master/weibo_ios_sdk_sso-oauth/0.0.1
$ cp weibo_ios_sdk_sso-oauth.podspec ~/.cocoapods/master/weibo_ios_sdk_sso-oauth/0.0.1
使用私有的pods
我們可以直接指定某一個依賴的podspec栅螟,這樣就可以使用公司的私有庫。該方案有利于使企業(yè)內部的公共項目支持CocoaPods篱竭。
pod 'MyCommon', :podspec => 'https://yuantiku.com/common/myCommon.podspec'
不更新podspec
CocoaPods在執(zhí)行pod install和pod update時力图,會默認先更新一次pod spec索引。使用--no-repo-update參數(shù)可以禁止其做索引更新操作
pod install --no-repo-update
pod update --no-repo-update
原理:
CocoaPods是將所有的依賴庫都放到另一個名為Pods項目中掺逼,然后讓主項目依賴Pods項目吃媒,這樣,源碼管理工作都從主項目移到了Pods項目中吕喘。
Pods項目最終會編譯成一個名為libPods.a的文件赘那,主項目只需要依賴這個.a問價即可。
對于資源文件氯质,CocoaPods提供了一個名為Pods-resources.sh的bash腳本募舟,該腳本在每次項目編譯的時候都會執(zhí)行,將第三方庫的各種資源文件復制到目標目錄中病梢。
CocoaPods通過一個名為Pods.xcconfig的文件夾在編譯時設置所有的依賴和參數(shù)胃珍。