iOS依賴庫管理工具之CocoaPods

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)容,可以參看這幾篇文章:

Library vs Framework in iOS

iOS里的動(dòng)態(tài)庫和靜態(tà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.參考資料

深入理解 CocoaPods

CocoaPods詳解之----使用篇

CocoaPods

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末博个,一起剝皮案震驚了整個(gè)濱河市怀樟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盆佣,老刑警劉巖往堡,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件械荷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡虑灰,警方通過查閱死者的電腦和手機(jī)吨瞎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穆咐,“玉大人颤诀,你說我怎么就攤上這事《耘龋” “怎么了崖叫?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)拍柒。 經(jīng)常有香客問我心傀,道長(zhǎng),這世上最難降的妖魔是什么斤儿? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任剧包,我火速辦了婚禮,結(jié)果婚禮上往果,老公的妹妹穿的比我還像新娘疆液。我一直安慰自己,他們只是感情好陕贮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布堕油。 她就那樣靜靜地躺著,像睡著了一般肮之。 火紅的嫁衣襯著肌膚如雪掉缺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天戈擒,我揣著相機(jī)與錄音眶明,去河邊找鬼。 笑死筐高,一個(gè)胖子當(dāng)著我的面吹牛搜囱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柑土,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蜀肘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了稽屏?” 一聲冷哼從身側(cè)響起扮宠,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狐榔,沒想到半個(gè)月后坛增,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體获雕,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年轿偎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了典鸡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片被廓。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坏晦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嫁乘,到底是詐尸還是另有隱情昆婿,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布蜓斧,位于F島的核電站仓蛆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏挎春。R本人自食惡果不足惜看疙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望直奋。 院中可真熱鬧能庆,春花似錦、人聲如沸脚线。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邮绿。三九已至渠旁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間船逮,已是汗流浹背顾腊。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挖胃,地道東北人杂靶。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像冠骄,于是被迫代替她去往敵國和親伪煤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

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