用CocoaPods做iOS程序的依賴管理

CocoaPods 簡介

每種語言發(fā)展到一個(gè)階段,就會(huì)出現(xiàn)相應(yīng)的依賴管理工具,例如 Java 語言的 Maven,nodejs 的 npm。隨著 iOS 開發(fā)者的增多,業(yè)界也出現(xiàn)了為 iOS 程序提供依賴管理的工具,它的名字叫做:CocoaPods。

CocoaPods項(xiàng)目的源碼 在 Github 上管理。該項(xiàng)目開始于 2011 年 8 月 12 日,經(jīng)過多年發(fā)展,現(xiàn)在已經(jīng)成為 iOS 開發(fā)事實(shí)上的依賴管理標(biāo)準(zhǔn)工具。開發(fā) iOS 項(xiàng)目不可避免地要使用第三方開源庫,CocoaPods 的出現(xiàn)使得我們可以節(jié)省設(shè)置和更新第三方開源庫的時(shí)間。

在iOS開發(fā)時(shí),使用了 24 個(gè)第三方開源庫。在沒有使用 CocoaPods 以前,我需要:

1.把這些第三方開源庫的源代碼文件復(fù)制到項(xiàng)目中,或者設(shè)置成 git 的 submodule。

2/對(duì)于這些開源庫通常需要依賴系統(tǒng)的一些 framework,我需要手工地將這些 framework 分別增加到項(xiàng)目依賴中,比如通常情況下,一個(gè)網(wǎng)絡(luò)庫就需要增加以下 framework: CFNetwork, SystemConfiguration, MobileCoreServices, CoreGraphics, zlib。

3.對(duì)于某些開源庫,我還需要設(shè)置-licucore或者 -fno-objc-arc等編譯參數(shù)

管理這些依賴包的更新。

這些體力活雖然簡單,但毫無技術(shù)含量并且浪費(fèi)時(shí)間。在使用 CocoaPods 之后,我只需要將用到的第三方開源庫放到一個(gè)名為 Podfile 的文件中,然后執(zhí)行pod install。

CocoaPods 就會(huì)自動(dòng)將這些第三方開源庫的源碼下載下來,并且為我的工程設(shè)置好相應(yīng)的系統(tǒng)依賴和編譯參數(shù)。


安裝

(1)、將Ruby 的軟件源替換成國內(nèi)的

ruby 的軟件源( https://rubygems.org )使用的是亞馬遜的云服務(wù),所以自帶的需要翻墻,但我們可以使用如下代碼將官方的 ruby 源替換成國內(nèi)淘寶的源(https://ruby.taobao.org/ )或者是由 Ruby China 社區(qū)專注維護(hù)的這個(gè)源(https://gems.ruby-china.org/ )。(我在鏡像的時(shí)候開始用的是淘寶的,但會(huì)卡死,可能是不能用了,也可能是網(wǎng)速慢,在后面講“坑”的時(shí)候會(huì)說)。在這我用的是Ruby China 社區(qū)專注維護(hù)的這個(gè)源(https://gems.ruby-china.org/)。

*首先,執(zhí)行以下命令刪除原來的ruby源:

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

然后下一步添加你找到的可用的鏡像源

gem sources -a https://gems.ruby-china.org/

gem sources ? ?//驗(yàn)證新源是否替換成功

*** CURRENT SOURCES ***

https://gems.ruby-china.org

到此ruby 源替已經(jīng)換成國內(nèi)的源

其中可能遇到的坑:

1.之前寫地址時(shí),要注意https,gems,ruby-china的寫法,有時(shí)會(huì)容易寫成http,gem,ruby.china,導(dǎo)致出現(xiàn)莫名其妙的錯(cuò)誤

2.如果出現(xiàn)Error fetching的錯(cuò)誤,注意查查下對(duì)應(yīng)地址是否可以用網(wǎng)頁打開,如果不行,可能DNS地址被劫持了,替換DNS為8.8.8.8/8.8.4.4這兩組GoogleDNS,另外可以斷電幾分鐘重啟下路由器


(2)安裝

很簡單的一句話

sudo gem install -n /usr/local/bin cocoapods

如果gem出現(xiàn)錯(cuò)誤

Unable to resolve dependencies

那么就輸入

sudo gem update --system

然后

pod setup

在此步驟時(shí)間漫長,又最容易出問題,眾多問題親歷見具體案例

創(chuàng)建文件 Podfile


在終端中進(jìn)入(cd命令)你項(xiàng)目所在目錄,然后在當(dāng)前目錄下,創(chuàng)建Podfile,運(yùn)行:

touch profile

然后在Podfile文件中輸入以下文字:

platform :ios, '7.0'

pod "AFNetworking", "~> 2.0"

這時(shí)候,你會(huì)發(fā)現(xiàn)你的項(xiàng)目目錄中,出現(xiàn)一個(gè)名字為Podfile的文件,而且文件內(nèi)容就是你剛剛輸入的內(nèi)容。注意,Podfile文件應(yīng)該和你的工程文件.xcodeproj在同一個(gè)目錄下。

這時(shí)候,你就可以利用CocoPods下載AFNetworking類庫了。還是在終端中的當(dāng)前項(xiàng)目目錄下,運(yùn)行以下命令:

cd "your project home"

pod install

現(xiàn)在,你的所有第三方庫都已經(jīng)下載完成并且設(shè)置好了編譯參數(shù)和依賴,你只需要記住如下 2 點(diǎn)即可:

使用 CocoaPods 生成的 .xcworkspace 文件來打開工程,而不是以前的 .xcodeproj 文件。

每次更改了 Podfile 文件,你需要重新執(zhí)行一次pod update命令。


查找第三方庫

你如果不知道 cocoaPods 管理的庫中,是否有你想要的庫,那么你可以通過 pod search 命令進(jìn)行查找,以下是我用 pod search json 查找到的所有可用的庫:

$ pod search json

-> AnyJSON (0.0.1)

Encode / Decode JSON by any means possible.

- Homepage: https://github.com/mattt/AnyJSON

- Source:? https://github.com/mattt/AnyJSON.git

- Versions: 0.0.1 [master repo]

-> JSONKit (1.5pre)

A Very High Performance Objective-C JSON Library.

- Homepage: https://github.com/johnezang/JSONKit

- Source:? git://github.com/johnezang/JSONKit.git

- Versions: 1.5pre, 1.4 [master repo]

// ... 以下省略若干行

關(guān)于 Podfile.lock

當(dāng)你執(zhí)行pod install之后,除了 Podfile 外,CocoaPods 還會(huì)生成一個(gè)名為Podfile.lock的文件,Podfile.lock 應(yīng)該加入到版本控制里面,不應(yīng)該把這個(gè)文件加入到.gitignore中。因?yàn)镻odfile.lock會(huì)鎖定當(dāng)前各依賴庫的版本,之后如果多次執(zhí)行pod install 不會(huì)更改版本,要pod update才會(huì)改Podfile.lock了。這樣多人協(xié)作的時(shí)候,可以防止第三方庫升級(jí)時(shí)造成大家各自的第三方庫版本不一致。

CocoaPods 的這篇官方文檔也在What is a Podfile.lock一節(jié)中介紹了Podfile.lock的作用,并且指出:

This file should always be kept under version control.

如果 pod update / pod install 命令執(zhí)行過慢

(首次運(yùn)行的時(shí)候不要)執(zhí)行pod install還是pod update都卡在了Analyzing dependencies不動(dòng)原因在于當(dāng)執(zhí)行以上兩個(gè)命令的時(shí)候會(huì)升級(jí)CocoaPods的spec倉庫,加一個(gè)參數(shù)可以省略這一步,然后速度就會(huì)提升不少。

加參數(shù)的命令如下:

pod install --no-repo-update

pod update --no-repo-update

生成第三方庫的幫助文檔

如果你想讓 CococaPods 幫你生成第三方庫的幫助文檔,并集成到 Xcode 中,那么用 brew 安裝 appledoc 即可:

brew install appledoc

關(guān)于 appledoc,在《使用 Objective-C 的文檔生成工具:appledoc》 中有專門介紹。它最大的優(yōu)點(diǎn)是可以將幫助文檔集成到 Xcode 中,這樣你在敲代碼的時(shí)候,按住 opt 鍵單擊類名或方法名,就可以顯示出相應(yīng)的幫助文檔。


pod install 和 pod update

pod install一般是你第一次想要為項(xiàng)目添加pod的時(shí)候使用的,它同樣也使用在你為Podfile文件添加或移除pod庫的時(shí)候。

每次pod install命令運(yùn)行的時(shí)候,pod install會(huì)為每一個(gè)它安裝的pod庫在Podfile.lock文件中寫入其版本號(hào)。Podfile.lock文件追蹤每一個(gè)安裝的pod庫的版本號(hào),并鎖定這些版本號(hào)。

當(dāng)你運(yùn)行pod install是,它將只解決不在Podfile.lock中的pod庫依賴關(guān)系

對(duì)于在Podfile.lock文件中的pod庫,pod install會(huì)只下載Podfile.lock文件中指定的版本,而不會(huì)去檢查這個(gè)庫是否有更新的版本。

對(duì)于不在Podfile.lock文件中的pod庫,pod install會(huì)搜索這個(gè)pod庫在Podfile文件中指定的版本

pod update

當(dāng)你運(yùn)行了pod update PODNAME命令,CocoaPods會(huì)在不考慮Podfile.lock中版本的情況下試著去查找PODNAME的最新版本。pod update PODNAME命令會(huì)將相應(yīng)的pod更新到最新的版本(新版本仍然遵守你在Podfile中做的限制)

唯一能夠保證團(tuán)隊(duì)中所有的成員都用使用pod庫的相同版本的方法就是使用Podfile.lock并且正確的使用pod install和pod update

原理

大概研究了一下 CocoaPods 的原理,它是將所有的依賴庫都放到另一個(gè)名為 Pods 項(xiàng)目中,然后讓主項(xiàng)目依賴 Pods 項(xiàng)目,這樣,源碼管理工作都從主項(xiàng)目移到了 Pods 項(xiàng)目中。發(fā)現(xiàn)的一些技術(shù)細(xì)節(jié)有:

Pods 項(xiàng)目最終會(huì)編譯成一個(gè)名為 libPods.a 的文件,主項(xiàng)目只需要依賴這個(gè) .a 文件即可。

對(duì)于資源文件,CocoaPods 提供了一個(gè)名為 Pods-resources.sh 的 bash 腳本,該腳本在每次項(xiàng)目編譯的時(shí)候都會(huì)執(zhí)行,將第三方庫的各種資源文件復(fù)制到目標(biāo)目錄中。

CocoaPods 通過一個(gè)名為 Pods.xcconfig 的文件來在編譯時(shí)設(shè)置所有的依賴和參數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評(píng)論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評(píng)論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評(píng)論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,779評(píng)論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評(píng)論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評(píng)論 0 291
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評(píng)論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,515評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,750評(píng)論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,933評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評(píng)論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,492評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,703評(píng)論 2 380

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

  • 原文地址:用CocoaPods做iOS程序的依賴管理 - 唐巧的技術(shù)博客 CocoaPods簡介 每種語言發(fā)...
    Mark_Lin閱讀 312評(píng)論 0 1
  • 轉(zhuǎn)載:唐巧的技術(shù)博客 CocoaPods 簡介 每種語言發(fā)展到一個(gè)階段,就會(huì)出現(xiàn)相應(yīng)的依賴管理工具,例如 Java...
    喜歡就可以閱讀 256評(píng)論 0 1
  • 這篇文章主要是轉(zhuǎn)載唐巧的,文章底部也有大神寫的原文連接,其中在有些地方根據(jù)自己的使用稍微修改了一點(diǎn)點(diǎn),當(dāng)然,不是說...
    devZhang閱讀 565評(píng)論 1 0
  • 記得看過一個(gè)微電影,講關(guān)于錢的。男主角說 錢有時(shí)候是好東西,有時(shí)候挺混蛋的。 上了大學(xué)才發(fā)現(xiàn),生活中沒錢真的不行。...
    晚安你好嗯閱讀 295評(píng)論 3 1
  • 就是沒有名閱讀 243評(píng)論 1 3