iOS依賴庫管理工具之CocoaPods

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

1.為什么要用CocoaPods?

在iOS項(xiàng)目開發(fā)過程中,我們經(jīng)常會使用一些第三方庫,如AFNetworking、YYKit、Masonry等,通過這些優(yōu)秀的第三方庫,來幫助我們更有效率的進(jìn)行開發(fā)。回想一下我們導(dǎo)入這些第三方庫的過程:

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

第二步:添加第三方庫使用到的Framework;

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

第四步:如果第三方庫有更新,需要將工程中使用的第三方庫刪除,重新執(zhí)行前面的三個步驟。

上面的四個步驟,如果我們使用CocoaPods,那么只需要配置好相應(yīng)的Podfile,CocoaPods會為我們?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í)行下面的指令,如果沒有報錯,則說明安裝成功。

$ pod setup

【說明】:如果執(zhí)行上面指令的時候,長時間沒有反應(yīng),這可能是因?yàn)镽uby的默認(rèn)源使用cocoapods.org,國內(nèi)訪問這個網(wǎng)址有時候會有問題,可以將該源替換成淘寶的(如果淘寶的有問題,可以用https://gems.ruby-china.org/),替換方式如下:

$ gem sources --remove https://rubygems.org/

$ gem sources -a http://ruby.taobao.org/

替換完成之后,執(zhí)行指令:

$ gem sources -l

如果輸出結(jié)果和下圖一樣,則表示替換成功。

3.升級CocoaPods

CocoaPods的升級很簡單,直接執(zhí)行安裝指令即可:

$ sudo gem install cocoapods

4.Podfile文件說明

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

先看一個示例的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ì)說一下:

序號語句說明

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。這個基于你指定的版本號的最后一個部分。這個例子等效于>= 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下新加了一個目錄:

對比一下我們常規(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)建一個演示項(xiàng)目

為了演示使用CocoaPods的過程,在這里創(chuàng)建了一個MVVMDemo的演示項(xiàng)目,創(chuàng)建項(xiàng)目的過程這里不細(xì)說了。

5.2創(chuàng)建Podfile文件

在終端進(jìn)入項(xiàng)目所在目錄,然后用如下指令創(chuàng)建Podfile文件:

$ touch Podfile

此時項(xiàng)目文件夾里會創(chuàng)建一個名為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就會做如下工作:下載源碼、配置依賴關(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)在再看一下工程目錄的變化:

從上圖可以看到,多了三個文件:

Podfile.lock:這是 CocoaPods 創(chuàng)建的最重要的文件之一。它記錄了需要被安裝的 pod 的每個已安裝的版本。如果你想知道已安裝的 pod 是哪個版本,可以查看這個文件。推薦將 Podfile.lock 文件加入到版本控制中,這有助于整個團(tuán)隊(duì)的一致性。

MVVMDemo.xcworkspace:從上面的執(zhí)行結(jié)果可以看到,紅色部分的注釋提示我們現(xiàn)在項(xiàng)目用MVVMDemo.xcworkspace來打開,原來的工程設(shè)置已經(jīng)被更改了,如果直接打開原來的工程文件去編譯就會報錯,只能使用新生成的workspace來進(jìn)行項(xiàng)目管理。

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

打開MVVMDemo.xcworkspace工程,界面如下:

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

6.常見問題

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

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

警告“...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”時,需要留意一下保留DEBUG時的日志打印(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中使用私有庫?

很簡單,兩個步驟:

第一步:引入source源:

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

第二步:pod私有庫:

pod'GofKit'

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

執(zhí)行pod install 或pod update 很多時候都卡在了Analyzing dependencies不動,這是更新本地的pod spec索引文件導(dǎo)致的。通過--no-repo-update標(biāo)志可以不更新本地pod spec索引。當(dāng)然首次install不應(yīng)該添加這個標(biāo)志,后續(xù)修改Podfile的時候可以適當(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)容,可以參看這幾篇文章:

Library vs Framework in iOS

iOS里的動態(tài)庫和靜態(tài)庫

Xcode7 開發(fā)靜態(tài)庫和動態(tài)庫

這里做一個簡單的介紹:

用cocoapods 導(dǎo)入swift 框架 到 swift項(xiàng)目和OC項(xiàng)目都必須要 use_frameworks!

use_frameworks!只能在iOS 8及以上平臺使用;

使用 dynamic frameworks,必須要在Podfile文件中添加 use_frameworks!

不使用use_frameworks!,在執(zhí)行pod update指令之后,會生成對應(yīng)的.a文件(靜態(tài)鏈接庫):

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

7.參考資料

深入理解 CocoaPods

CocoaPods詳解之----使用篇

CocoaPods

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

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

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

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