CocoaPods 是開發(fā) OS X 和 iOS 應(yīng)用程序的一個(gè)第三方庫的依賴管理工具。利用 CocoaPods宋税,可以定義自己的依賴關(guān)系庫 (稱作pods)吕朵,并且隨著時(shí)間的變化,在整個(gè)開發(fā)環(huán)境中對(duì)第三方庫的版本管理非常方便账阻。
1.為什么要用CocoaPods充坑?
在iOS項(xiàng)目開發(fā)過程中减江,我們經(jīng)常會(huì)使用一些第三方庫,如AFNetworking捻爷、YYKit辈灼、Masonry等,通過這些優(yōu)秀的第三方庫也榄,來幫助我們更有效率的進(jìn)行開發(fā)巡莹。回想一下我們導(dǎo)入這些第三方庫的過程:
第一步:下載第三方庫的源代碼并添加到工程甜紫;
第二步:添加第三方庫使用到的Framework降宅;
第三步:處理第三方庫之間或第三方庫與工程之間的依賴關(guān)系以及重復(fù)添加等問題;
第四步:如果第三方庫有更新囚霸,需要將工程中使用的第三方庫刪除腰根,重新執(zhí)行前面的三個(gè)步驟。
上面的四個(gè)步驟拓型,如果我們使用CocoaPods额嘿,那么只需要配置好相應(yīng)的Podfile,CocoaPods會(huì)為我們?nèi)プ龊眠@些事情劣挫。
2.安裝CocoaPods
CocoaPods是用Ruby?的依賴管理 gem 進(jìn)行構(gòu)建的册养,要想使用它首先需要有Ruby的環(huán)境。OS X系統(tǒng)默認(rèn)可以運(yùn)行Ruby揣云,因此執(zhí)行以下命令即可:
$ sudo gem install cocoapods
安裝完成后捕儒,執(zhí)行下面的指令东羹,如果沒有報(bào)錯(cuò)端礼,則說明安裝成功萤厅。
$ pod setup
【說明】:如果執(zhí)行上面指令的時(shí)候,長(zhǎng)時(shí)間沒有反應(yīng)焚刚,這可能是因?yàn)镽uby的默認(rèn)源使用cocoapods.org,國內(nèi)訪問這個(gè)網(wǎng)址有時(shí)候會(huì)有問題扇调,可以將該源替換成淘寶的(如果淘寶的有問題矿咕,可以用https://gems.ruby-china.org/),替換方式如下:
$ gem sources --remove https://rubygems.org/
$ gem sources -a http://ruby.taobao.org/
替換完成之后,執(zhí)行指令:
$ gem sources -l
如果輸出結(jié)果和下圖一樣碳柱,則表示替換成功捡絮。
3.升級(jí)CocoaPods
CocoaPods的升級(jí)很簡(jiǎn)單,直接執(zhí)行安裝指令即可:
$ sudo gem install cocoapods
4.Podfile文件說明
Podfile是一個(gè)文件莲镣,用于定義項(xiàng)目所需要使用的第三方庫福稳。該文件支持高度定制,詳細(xì)的信息可以參考Podfile 指南瑞侮。下面列出常用的語法并進(jìn)行說明的圆。
先看一個(gè)示例的Podfile文件:
source 'https://github.com/Artsy/Specs.git'
source 'https://github.com/CocoaPods/Specs.git'
platform:ios, '8.0'
inhibit_all_warnings!
target 'MVVMReactiveCocoa'dopod 'SDWebImage', '~> 3.7.1'
pod 'UIActivityIndicator-for-SDWebImage'
pod 'MBProgressHUD', '~> 0.9'
pod 'SSKeychain', '~> 1.2.2'
pod 'IQKeyboardManager', '~> 3.2.0.3'
pod 'SVPullToRefresh', '~> 0.4.1'
pod 'MKNetworkKit', '~> 0.87'
pod 'WebViewJavascriptBridge', '~> 4.1.4'
pod 'FormatterKit', '~> 1.8.0'
pod 'DZNEmptyDataSet', '~> 1.5.1'
pod 'Ono', '~> 1.2.0'
pod 'FMDB'
pod 'UMengSocial', '~> 4.3'
pod 'GPUImage', '~> 0.1.7'
pod 'Reveal-iOS-SDK', '~> 1.6.0'
pod 'Appirater'
pod 'SDVersion'
pod 'YYKit'
pod 'OcticonsIOS',:git=> 'https://github.com/jacksonh/OcticonsIOS.git',:commit=>'4bd3b21'
pod 'LCFInfiniteScrollView',:git=> 'https://github.com/leichunfeng/LCFInfiniteScrollView.git'
target 'MVVMReactiveCocoaTests'doinherit!:search_pathsendend
看到上面的Podfile文件,有些語句的含義半火,我們也能大概理解越妈,下面細(xì)說一下:
序號(hào)語句說明
1source ?'URL'指定鏡像倉庫的源
2platform : iOS, ?'6.0'指定所支持系統(tǒng)和最低版本
3inhibit_all_warnings!屏蔽所有warning
4workspace '項(xiàng)目空間名'指定項(xiàng)目空間名
5xcodeproj '工程文件名'指定xcodeproj工程文件名
6pod ?'庫名'引入庫,什么版本都可以(一般是最新版本)
7pod ?'庫名', '版本'引入指定版本的庫
8pod '庫名', :podspec => 'podspec文件路徑'指定導(dǎo)入庫的podspec文件路徑
9pod '庫名', :Git?=> '源碼git地址'指定導(dǎo)入庫的源碼git地址
10pod '庫名', :tag => 'tag名'指定導(dǎo)入庫的Tag分支
關(guān)于引入庫的版本钮糖,除了指定和不指定之外梅掠,還有如下操作:
>0.1高于0.1的任何版本;
>=0.1版本0.1和任何更高版本店归;
<0.1低于0.1的任何版本瓤檐;
<=0.1版本0.1和任何較低的版本;
?>0.1.2版本 0.1.2的版本到0.2 娱节,不包括0.2挠蛉。這個(gè)基于你指定的版本號(hào)的最后一個(gè)部分。這個(gè)例子等效于>= 0.1.2并且 <0.2.0肄满,并且始終是你指定范圍內(nèi)的最新版本谴古。
【補(bǔ)充】:關(guān)于pod指令,除了常規(guī)的pod '庫名'方式稠歉,還有下面這些帶參數(shù)的方式:
1.使用本地路徑掰担。
pod'AFNetworking', :path =>'~/Documents/AFNetworking'
使用path方式,執(zhí)行“pod install”怒炸,指令后带饱,可以看到Pods下新加了一個(gè)目錄:
對(duì)比一下我們常規(guī)的pod方式:
2.使用主分支的版本,也就是默認(rèn)寫法。
pod'AFNetworking', :git =>'https://github.com/gowalla/AFNetworking.git'
3.不使用主分支阅羹,使用指定分支勺疼。
pod'AFNetworking', :git =>'https://github.com/gowalla/AFNetworking.git', :branch =>'dev'
4.使用指定的commit版本。
pod'AFNetworking', :git =>'https://github.com/gowalla/AFNetworking.git', :commit =>'082f8319af'
5.使用指定tag版本
pod'AFNetworking', :git =>'https://github.com/gowalla/AFNetworking.git', :tag =>'0.7.0'
5.使用CocoaPods
5.1創(chuàng)建一個(gè)演示項(xiàng)目
為了演示使用CocoaPods的過程捏鱼,在這里創(chuàng)建了一個(gè)MVVMDemo的演示項(xiàng)目执庐,創(chuàng)建項(xiàng)目的過程這里不細(xì)說了。
5.2創(chuàng)建Podfile文件
在終端進(jìn)入項(xiàng)目所在目錄导梆,然后用如下指令創(chuàng)建Podfile文件:
$ touch Podfile
此時(shí)項(xiàng)目文件夾里會(huì)創(chuàng)建一個(gè)名為Podfile的文件轨淌,如下圖所示:
5.3編輯Podfile文件
使用XCode打開Podfile文件:
$ open -a Xcode Podfile
在這里迂烁,我們需要導(dǎo)入AFNetworking、YYKit递鹉、Masonry庫盟步,因此在Podfile文件中輸入如下內(nèi)容:
source 'https://github.com/CocoaPods/Specs.git'
platform:ios, '8.0'inhibit_all_warnings!
target 'MVVMDemo' do pod 'AFNetworking' pod 'YYKit' pod 'Masonry'
end
5.4執(zhí)行導(dǎo)入命令
編寫完成Podfile文件之后,保存關(guān)閉躏结,輸入如下指令導(dǎo)入第三方庫:
$ pod install
CocoaPods就會(huì)做如下工作:下載源碼址芯、配置依賴關(guān)系、引入需要的framework等窜觉。命令的執(zhí)行結(jié)果如下所示:
Updating local specs repositories
CocoaPods1.1.0.beta.1 is available.To updateuse: `gem install cocoapods --pre`
[!] This is a test version we'd love you to try.Formore information see http://blog.cocoapods.org
and the CHANGELOGforthis version http://git.io/BaH8pQ.Analyzing dependencies
Downloading dependencies
Installing AFNetworking(3.1.0)Installing Masonry(1.0.1)Installing YYKit(1.0.7)Generating Pods projectIntegrating client project[!] Please close any current Xcode sessions anduse `MVVMDemo.xcworkspace` for this project from now on.Sending stats
Sending stats
Pod installation complete! There are3 dependencies from the Podfile and 3total
pods installed.
這說明pod install命令執(zhí)行成功了」日ǎ現(xiàn)在再看一下工程目錄的變化:
從上圖可以看到,多了三個(gè)文件:
Podfile.lock:這是 CocoaPods 創(chuàng)建的最重要的文件之一禀挫。它記錄了需要被安裝的 pod 的每個(gè)已安裝的版本旬陡。如果你想知道已安裝的 pod 是哪個(gè)版本,可以查看這個(gè)文件语婴。推薦將 Podfile.lock 文件加入到版本控制中描孟,這有助于整個(gè)團(tuán)隊(duì)的一致性。
MVVMDemo.xcworkspace:從上面的執(zhí)行結(jié)果可以看到砰左,紅色部分的注釋提示我們現(xiàn)在項(xiàng)目用MVVMDemo.xcworkspace來打開匿醒,原來的工程設(shè)置已經(jīng)被更改了,如果直接打開原來的工程文件去編譯就會(huì)報(bào)錯(cuò)缠导,只能使用新生成的workspace來進(jìn)行項(xiàng)目管理廉羔。
Pods:CocoaPods會(huì)將所有的第三方庫以target的方式組成一個(gè)名為Pods的工程。整個(gè)第三方庫工程會(huì)生成一個(gè)名稱為libPods.a的靜態(tài)庫給MVVMDemo項(xiàng)目使用僻造。
打開MVVMDemo.xcworkspace工程憋他,界面如下:
在項(xiàng)目中引用剛才添加的第三方庫的頭文件,執(zhí)行編譯操作髓削,操作成功竹挡。
6.常見問題
問題一:舊工程項(xiàng)目切換到CocoaPods,執(zhí)行“pod install”指令時(shí)立膛,有可能出現(xiàn)如下警告信息:
產(chǎn)生上面警告的原因是項(xiàng)目 Target 中的一些設(shè)置揪罕,CocoaPods 也做了默認(rèn)的設(shè)置,如果兩個(gè)設(shè)置結(jié)果不一致宝泵,就會(huì)造成問題好啰。修改方案如下:
警告“...target overrides the `OTHER_LDFLAGS` build setting defined...”:點(diǎn)擊項(xiàng)目文件 project.xcodeproj,右鍵顯示包內(nèi)容鲁猩,用文本編輯器打開project.pbxproj坎怪,刪除OTHER_LDFLAGS的地方,保存廓握,執(zhí)行pod update指令即可消除該警告搅窿;
警告“...target overrides the `GCC_PREPROCESSOR_DEFINITIONS` build setting defined...”:修改工程target,具體是這兩項(xiàng)“Build Settings -> Other linker flags”和“Build Settings -> Preprocessor Macros”隙券,在這兩處添加“$(inherited)”男应;修改“Build Settings -> Preprocessor Macros”時(shí),需要留意一下保留DEBUG時(shí)的日志打印(DEBUG=1)娱仔;
警告“...target overrides the `LIBRARY_SEARCH_PATHS` build setting defined...” :修改工程target沐飘,具體是“Build Settings -> Library Search Paths”,在這里添加“$(inherited)”牲迫;
警告“...target overrides the `HEADER_SEARCH_PATHS` build setting defined...”:修改工程target耐朴,具體是“Build Settings -> Header Search Paths”,在這里添加“$(inherited)”盹憎;
關(guān)于$(inherited)可查看這兩篇文章:
Xcode 中 Build Setting 的兩處設(shè)置
What is $(inherited) in Xcode's search path settings?
問題二:怎樣在CocoaPods中使用私有庫筛峭?
很簡(jiǎn)單,兩個(gè)步驟:
第一步:引入source源:
source'git@git:/Data/git/ios/GofSpecs.git'
第二步:pod私有庫:
pod'GofKit'
問題三:怎么加快pod install 或pod update指令執(zhí)行時(shí)間陪每?
執(zhí)行pod install 或pod update 很多時(shí)候都卡在了Analyzing dependencies不動(dòng)影晓,這是更新本地的pod spec索引文件導(dǎo)致的。通過--no-repo-update標(biāo)志可以不更新本地pod spec索引檩禾。當(dāng)然首次install不應(yīng)該添加這個(gè)標(biāo)志挂签,后續(xù)修改Podfile的時(shí)候可以適當(dāng)使用,加快pod速度盼产。
問題四:怎樣輸出指令詳細(xì)日志饵婆?
podinstall--verbose
問題五:怎樣忽略某些文件或文件夾,讓這些文件或文件夾不使用git管理戏售?
在項(xiàng)目的根目錄(跟.git文件夾所在目錄同層)建立.gitignore文件啦辐,在里面聲明即可。例如:
#ignore these files
GofViewMakerDemo/Pods/*
上面的.gitignore文件意思就是“GofViewMakerDemo/Pods/*”目錄下的所有文件不使用git管理蜈项。
這里有一份可忽略的文件列表:
View Code
問題六:怎樣導(dǎo)入swift庫芹关?
platform :ios,'8.0'use_frameworks!pod'Alamofire','~> 1.3'
關(guān)于Library 和 Framework的詳細(xì)內(nèi)容,可以參看這幾篇文章:
Xcode7 開發(fā)靜態(tài)庫和動(dòng)態(tài)庫
這里做一個(gè)簡(jiǎn)單的介紹:
用cocoapods 導(dǎo)入swift 框架 到 swift項(xiàng)目和OC項(xiàng)目都必須要 use_frameworks!
use_frameworks!只能在iOS 8及以上平臺(tái)使用紧卒;
使用 dynamic frameworks侥衬,必須要在Podfile文件中添加 use_frameworks!
不使用use_frameworks!,在執(zhí)行pod update指令之后跑芳,會(huì)生成對(duì)應(yīng)的.a文件(靜態(tài)鏈接庫):
使用use_frameworks!轴总,在執(zhí)行pod update指令之后,會(huì)生成對(duì)應(yīng)的.frameworks文件(動(dòng)態(tài)鏈接庫:實(shí)際內(nèi)容為Header + 動(dòng)態(tài)鏈接庫 + 資源文件):
7.參考資料