iOS依賴庫(kù)管理工具之CocoaPods

CocoaPods 是開(kāi)發(fā) OS X 和 iOS 應(yīng)用程序的一個(gè)第三方庫(kù)的依賴管理工具。利用 CocoaPods,可以定義自己的依賴關(guān)系庫(kù) (稱作pods),并且隨著時(shí)間的變化,在整個(gè)開(kāi)發(fā)環(huán)境中對(duì)第三方庫(kù)的版本管理非常方便。

1.為什么要用CocoaPods?

在iOS項(xiàng)目開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)使用一些第三方庫(kù),如AFNetworking、YYKit、Masonry等,通過(guò)這些優(yōu)秀的第三方庫(kù),來(lái)幫助我們更有效率的進(jìn)行開(kāi)發(fā)?;叵胍幌挛覀儗?dǎo)入這些第三方庫(kù)的過(guò)程:

第一步:下載第三方庫(kù)的源代碼并添加到工程;

第二步:添加第三方庫(kù)使用到的Framework;

第三步:處理第三方庫(kù)之間或第三方庫(kù)與工程之間的依賴關(guān)系以及重復(fù)添加等問(wèn)題;

第四步:如果第三方庫(kù)有更新,需要將工程中使用的第三方庫(kù)刪除,重新執(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í)行下面的指令,如果沒(méi)有報(bào)錯(cuò),則說(shuō)明安裝成功。

$ pod setup

【說(shuō)明】:如果執(zhí)行上面指令的時(shí)候,長(zhǎng)時(shí)間沒(méi)有反應(yīng),這可能是因?yàn)镽uby的默認(rèn)源使用cocoapods.org,國(guó)內(nèi)訪問(wèn)這個(gè)網(wǎng)址有時(shí)候會(huì)有問(wèn)題,可以將該源替換成淘寶的(如果淘寶的有問(wèn)題,可以用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文件說(shuō)明

Podfile是一個(gè)文件,用于定義項(xiàng)目所需要使用的第三方庫(kù)。該文件支持高度定制,詳細(xì)的信息可以參考Podfile 指南。下面列出常用的語(yǔ)法并進(jìn)行說(shuō)明。

先看一個(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文件,有些語(yǔ)句的含義,我們也能大概理解,下面細(xì)說(shuō)一下:

序號(hào)語(yǔ)句說(shuō)明

1source ?'URL'指定鏡像倉(cāng)庫(kù)的源

2platform : iOS, ?'6.0'指定所支持系統(tǒng)和最低版本

3inhibit_all_warnings!屏蔽所有warning

4workspace '項(xiàng)目空間名'指定項(xiàng)目空間名

5xcodeproj '工程文件名'指定xcodeproj工程文件名

6pod ?'庫(kù)名'引入庫(kù),什么版本都可以(一般是最新版本)

7pod ?'庫(kù)名', '版本'引入指定版本的庫(kù)

8pod '庫(kù)名', :podspec => 'podspec文件路徑'指定導(dǎo)入庫(kù)的podspec文件路徑

9pod '庫(kù)名', :Git?=> '源碼git地址'指定導(dǎo)入庫(kù)的源碼git地址

10pod '庫(kù)名', :tag => 'tag名'指定導(dǎo)入庫(kù)的Tag分支

關(guān)于引入庫(kù)的版本,除了指定和不指定之外,還有如下操作:

>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 '庫(kù)名'方式,還有下面這些帶參數(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的過(guò)程,在這里創(chuàng)建了一個(gè)MVVMDemo的演示項(xiàng)目,創(chuàng)建項(xiàng)目的過(guò)程這里不細(xì)說(shuō)了。

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打開(kāi)Podfile文件:

$ open -a Xcode Podfile

在這里,我們需要導(dǎo)入AFNetworking、YYKit、Masonry庫(kù),因此在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)入第三方庫(kù):

$ 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.

這說(shuō)明pod install命令執(zhí)行成功了?,F(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來(lái)打開(kāi),原來(lái)的工程設(shè)置已經(jīng)被更改了,如果直接打開(kāi)原來(lái)的工程文件去編譯就會(huì)報(bào)錯(cuò),只能使用新生成的workspace來(lái)進(jìn)行項(xiàng)目管理。

Pods:CocoaPods會(huì)將所有的第三方庫(kù)以target的方式組成一個(gè)名為Pods的工程。整個(gè)第三方庫(kù)工程會(huì)生成一個(gè)名稱為libPods.a的靜態(tài)庫(kù)給MVVMDemo項(xiàng)目使用。

打開(kāi)MVVMDemo.xcworkspace工程,界面如下:

在項(xiàng)目中引用剛才添加的第三方庫(kù)的頭文件,執(zhí)行編譯操作,操作成功。

6.常見(jiàn)問(wèn)題

問(wèn)題一:舊工程項(xiàng)目切換到CocoaPods,執(zhí)行“pod install”指令時(shí),有可能出現(xiàn)如下警告信息:

產(chǎn)生上面警告的原因是項(xiàng)目 Target 中的一些設(shè)置,CocoaPods 也做了默認(rèn)的設(shè)置,如果兩個(gè)設(shè)置結(jié)果不一致,就會(huì)造成問(wèn)題。修改方案如下:

警告“...target overrides the `OTHER_LDFLAGS` build setting defined...”:點(diǎn)擊項(xiàng)目文件 project.xcodeproj,右鍵顯示包內(nèi)容,用文本編輯器打開(kā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?

問(wèn)題二:怎樣在CocoaPods中使用私有庫(kù)?

很簡(jiǎn)單,兩個(gè)步驟:

第一步:引入source源:

source'git@git:/Data/git/ios/GofSpecs.git'

第二步:pod私有庫(kù):

pod'GofKit'

問(wèn)題三:怎么加快pod install 或pod update指令執(zhí)行時(shí)間?

執(zhí)行pod install 或pod update 很多時(shí)候都卡在了Analyzing dependencies不動(dòng),這是更新本地的pod spec索引文件導(dǎo)致的。通過(guò)--no-repo-update標(biāo)志可以不更新本地pod spec索引。當(dāng)然首次install不應(yīng)該添加這個(gè)標(biāo)志,后續(xù)修改Podfile的時(shí)候可以適當(dāng)使用,加快pod速度。

問(wèn)題四:怎樣輸出指令詳細(xì)日志?

podinstall--verbose

問(wèn)題五:怎樣忽略某些文件或文件夾,讓這些文件或文件夾不使用git管理?

在項(xiàng)目的根目錄(跟.git文件夾所在目錄同層)建立.gitignore文件,在里面聲明即可。例如:

#ignore these files

GofViewMakerDemo/Pods/*

上面的.gitignore文件意思就是“GofViewMakerDemo/Pods/*”目錄下的所有文件不使用git管理。

這里有一份可忽略的文件列表:

View Code

問(wèn)題六:怎樣導(dǎo)入swift庫(kù)?

platform :ios,'8.0'use_frameworks!pod'Alamofire','~> 1.3'

關(guān)于Library 和 Framework的詳細(xì)內(nèi)容,可以參看這幾篇文章:

Library vs Framework in iOS

iOS里的動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)

Xcode7 開(kāi)發(fā)靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)

這里做一個(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)鏈接庫(kù)):

使用use_frameworks!,在執(zhí)行pod update指令之后,會(huì)生成對(duì)應(yīng)的.frameworks文件(動(dòng)態(tài)鏈接庫(kù):實(shí)際內(nèi)容為Header + 動(dòng)態(tài)鏈接庫(kù) + 資源文件):

7.參考資料

深入理解 CocoaPods

CocoaPods詳解之----使用篇

CocoaPods

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 項(xiàng)目組件化、平臺(tái)化是技術(shù)公司的共同目標(biāo),越來(lái)越多的技術(shù)公司推崇使用pod管理第三方庫(kù)以及私有組件,一方面使項(xiàng)目架構(gòu)...
    swu_luo閱讀 22,876評(píng)論 0 39
  • 原文 : 與佳期的個(gè)人博客(gonghonglou.com) 工欲善其事,必先利其器!在iOS開(kāi)發(fā)中 CocoaP...
    與佳期閱讀 8,665評(píng)論 0 17
  • 旅行,是一個(gè)永遠(yuǎn)令人向往的話題。旅行的意義不在其他,而在自己身體和心靈,必須有一個(gè)在旅行的路上。在年輕的時(shí)...
    雨中聽(tīng)荷萍閱讀 531評(píng)論 0 2
  • 連晴了好些天,今天突然下雨了。 在我29歲的這一天。 一大早醒來(lái),沒(méi)有見(jiàn)到窗簾邊透過(guò)的強(qiáng)光,好像天還黑著一樣,就想...
    雪靈溪閱讀 834評(píng)論 12 5
  • 第一次聽(tīng)這首歌是在2012年6月24晚上。 第一次見(jiàn)二哈,是四年前,高一下期剛開(kāi)學(xué)。不高的個(gè)子在球場(chǎng)下大汗淋漓...
    simpleandlife閱讀 342評(píng)論 0 0

友情鏈接更多精彩內(nèi)容