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

原文 : 與佳期的個(gè)人博客(gonghonglou.com)

工欲善其事弹灭,必先利其器习绢!在iOS開(kāi)發(fā)中 CocoaPods 作為庫(kù)依賴管理工具就是一把利器。

有了CocoaPods你再也不需要手動(dòng)將需要的第三方庫(kù)拖進(jìn)你的工程、添加第三方庫(kù)所依賴的framework、設(shè)置如-fno-objc-arc等編譯參數(shù)刁绒、手動(dòng)管理這些庫(kù)的更新,當(dāng)某個(gè)第三方庫(kù)有依賴其他的庫(kù)還要繼續(xù)拖烤黍、拖知市、拖......

我們只需要將所需要的第三方庫(kù)聲明到一個(gè)名為Podfile文件中傻盟,然后執(zhí)行Pod install命令就OK了,CocoaPods就會(huì)自動(dòng)去下載我們所需要庫(kù)嫂丙,并為我的工程設(shè)置好相應(yīng)的系統(tǒng)依賴和編譯參數(shù)娘赴。

只能說(shuō),好用到哭~

安裝CocoaPods

CocoaPods依賴于Ruby環(huán)境奢入,剛好Mac下自帶Ruby筝闹,使用Ruby的gem命令即可安裝CocoaPods。
為防止因gem太老而引發(fā)問(wèn)題腥光,建議執(zhí)行如下命令先更新gem:

$ sudo gem update --system

執(zhí)行如下命令安裝CocoaPods:

$ sudo gem install cocoapods

如果執(zhí)行上述命令后沒(méi)有反應(yīng),那是因?yàn)镽uby的軟件源 https://rubygems.org 使用的是亞馬遜的云服務(wù)而被墻了(GFW的偉大糊秆。武福。。)
可以用淘寶的Ruby鏡像來(lái)訪問(wèn)cocoapods痘番,依次執(zhí)行如下命令將官方的Ruby源替換成國(guó)內(nèi)淘寶的源

# $ gem sources --remove https://rubygems.org/
# $ gem sources -a https://ruby.taobao.org/

執(zhí)行如下命令驗(yàn)證Ruby鏡像的確是taobao的:

# $ gem sources -l

出現(xiàn)如下文字才說(shuō)明上面的命令是執(zhí)行成功的:

# *** CURRENT SOURCES ***
#
# https://ruby.taobao.org/

此時(shí)捉片,再次執(zhí)行g(shù)em命令安裝CocoaPods:

$ sudo gem install cocoapods
$ pod setup

稍等片刻 即可安裝成功。

注: pod setup 是Cocoapods將它的信息下載到 ~/.cocoapods/repos 目錄下汞舱。即使在安裝時(shí)不執(zhí)行此命令伍纫,在初次執(zhí)行 pod install 命令時(shí),系統(tǒng)也會(huì)自動(dòng)執(zhí)行 pod setup

------10.27更新 以下------------------------------------------------

ruby.taobao.org 停止更新了昂芜,使用 cocoapods 的同學(xué)莹规,請(qǐng)更新到 ruby china 的源。更新方法:
使用如下命令查看鏡像源:

$ gem sources -l

更改鏡像源:

$ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
or
$ gem sources --add https://gems.ruby-china.org/ --remove https://ruby.taobao.org/

------10.27更新 以上------------------------------------------------

升級(jí)CocoaPods

升級(jí)CocoaPods非常簡(jiǎn)單泌神,使用Ruby的gem命令:

$ sudo gem update cocoapods           // 更新至最新版
or
$ sudo gem update cocoapods --pre     // 更新至預(yù)覽版

當(dāng)然執(zhí)行如下命令也可以更新:

$ sudo gem install cocoapods           // 更新至最新版
or
$ sudo gem install cocoapods --pre     // 更新至預(yù)覽版

注:OS X 10.11之后升級(jí)CocoaPods會(huì)有問(wèn)題良漱。解決方案參見(jiàn)下一篇博客:解決OS X 10.11之后CocoaPods的升級(jí)問(wèn)題

降級(jí)CocoaPods

有時(shí)我們需要降低CocoaPods版本來(lái)解決某些第三方庫(kù)的兼容問(wèn)題,例如RestKit不兼容CocoaPods的0.39.0版本欢际,降級(jí)到0.38.2就OK了母市。

移除RubyGems中的Cocoapods程序包

查看gems中本地程序包,執(zhí)行如下命令:

$ gem list

輸出如下:

*** LOCAL GEMS ***

activesupport (4.2.5.2)    
bigdecimal (1.2.8)    
claide (1.0.0.beta.1, 0.9.1)    
cocoapods (1.0.0.beta.4, 0.39.0)    
cocoapods-core (1.0.0.beta.4, 0.39.0)    
cocoapods-deintegrate (1.0.0.beta.1)    
cocoapods-downloader (1.0.0.beta.1, 0.9.3)    
cocoapods-plugins (1.0.0.beta.1, 0.4.2)    
cocoapods-search (1.0.0.beta.1, 0.1.0)    
cocoapods-stats (1.0.0.beta.3, 0.6.2)    
cocoapods-trunk (1.0.0.beta.2, 0.6.4)    
cocoapods-try (1.0.0.beta.2, 0.5.1)    
colored (1.2)    
did_you_mean (1.0.0)    
escape (0.0.4)    
fourflusher (0.3.0)    
fuzzy_match (2.0.4)    
i18n (0.7.0)    
io-console (0.4.5)    
json (1.8.3)    
minitest (5.8.3)    
molinillo (0.4.4)    
nap (1.1.0)    
net-telnet (0.1.1)    
netrc (0.7.8)     
power_assert (0.2.6)    
psych (2.0.17)    
rake (10.4.2)    
rdoc (4.2.1)    
rubygems-update (2.6.1)    
test-unit (3.1.5)    
thread_safe (0.3.5)    
tzinfo (1.2.2)    
xcodeproj (1.0.0.beta.3, 0.28.2)        

其中包含的CocoaPods版本:

cocoapods (1.0.0.beta.4, 0.39.0)

移除指定版本cocoapods如1.0.0.beta.4损趋,執(zhí)行如下命令:

$ sudo gem uninstall cocoapods -v 1.0.0.beta.4

成功刪除則輸出:

Successfully uninstalled cocoapods-1.0.0.beta.4

還有一個(gè)0.39.0版本患久,移除程序包,執(zhí)行如下命令:

$ sudo gem uninstall cocoapods -v 0.39.0

當(dāng)移除最后一個(gè)版本時(shí)浑槽,詢問(wèn):

Remove executables:
  pod, sandbox-pod

  in addition to the gem? [Yn]

按下回車(chē)鍵刪除pod蒋失。查看CocoaPods組件的安裝目錄,執(zhí)行命令$ which pod所得目錄下的pod文件隨即刪除括荡。

安裝指定版本的Cocoapods程序包

安裝指定版本的CocoaPods 如0.39.0高镐,執(zhí)行如下命令:

$ sudo gem install cocoapods -v 0.39.0

注:若不指定版本,即命令如sudo gem install cocoapods則默認(rèn)安裝最新版畸冲。

安裝成功后嫉髓,執(zhí)行命令查看版本號(hào):

$ pod --version

輸出:

0.39.0

使用CocoaPods

搜索第三方庫(kù)

為判斷某第三方庫(kù)(如AFNetworking)是否支持CocoaPods观腊,執(zhí)行如下命令來(lái)搜索:

$ pod search AFNetworking

若如下圖所示,則可用CocoaPods管理AFNetworking


searchAFNetworking

創(chuàng)建Podfile的文件

CocoaPods就可以根據(jù)Podfile文件里的內(nèi)容來(lái)幫你下載你所需要的庫(kù)算行。點(diǎn)擊前往CocoaPods官方對(duì)Podfile文件的介紹梧油。
終端cd到你的項(xiàng)目所在目錄下,創(chuàng)建Podfile文件:

$ vim Podfile

按下i鍵進(jìn)入輸入狀態(tài)州邢,在Podfile文件里輸入以下文字:

platform :ios, '8.0'
    
target 'Your_App_Name' do
pod 'AFNetworking', '~> 3.0'
end

按下esc鍵退出輸入儡陨。然后保存退出,命令是:wq量淌。你當(dāng)然可以使用vim之外的編輯軟件來(lái)編輯Podfile文件骗村。

注:cocoapods-1.0.0.beta版本后規(guī)定Podfile文件必須如上所示格式(加上target

當(dāng)然,采用創(chuàng)建Podfile文件的另一種方式呀枢,終端cd到你的項(xiàng)目所在目錄下執(zhí)行命令 pod init 會(huì)自動(dòng)生成格式胚股,自己試一下你會(huì)喜歡的~

終端cd到你的項(xiàng)目所在目錄下執(zhí)行如下命令來(lái)利用CocoPods下載第三方庫(kù):

$ pod install

如下圖所示則下載成功:

pod install

提示:[!] Please close any current Xcode sessions and use Your_App_Name.xcworkspace for this project from now on.

打開(kāi)Your_App_Name.xcworkspace 工程之后會(huì)看到 Pods 文件,AFNetwoking已經(jīng)成功導(dǎo)入項(xiàng)目了裙秋。

你或許應(yīng)當(dāng)點(diǎn)擊前往CocoaPods官網(wǎng)查看對(duì)pod install vs. pod update的介紹琅拌。

注:當(dāng)你 clone 別人的項(xiàng)目到本地后也需要終端cd到項(xiàng)目所在目錄下執(zhí)行命令 $ pod install

關(guān)于Podfile.lock的文件

執(zhí)行pod install之后,CocoaPods會(huì)生成一個(gè)名為Podfile.lock的文件摘刑。并鎖定當(dāng)前各依賴庫(kù)的版本进宝,之后如果多次執(zhí)行pod install或者團(tuán)隊(duì)中的其它人check下來(lái)這份包含Podfile.lock文件的工程后再執(zhí)行pod install命令時(shí),獲取下來(lái)的Pods依賴庫(kù)的版本就和最開(kāi)始用戶獲取到的版本一致枷恕。如果沒(méi)有Podfile.lock文件党晋,執(zhí)行pod install命令會(huì)獲取第三方庫(kù)的最新版本,這就有可能造成同一個(gè)團(tuán)隊(duì)使用的依賴庫(kù)版本不一致活尊,這對(duì)團(tuán)隊(duì)協(xié)作的危害無(wú)疑是災(zāi)難性的隶校!
在這種情況下,如果團(tuán)隊(duì)想使用當(dāng)前最新版本的依賴庫(kù)蛹锰,有兩種方案可修改Podfile.lock的紀(jì)錄:

  • 更改Podfile中各依賴庫(kù)的版本
  • 執(zhí)行pod update命令

鑒于Podfile.lock文件對(duì)團(tuán)隊(duì)協(xié)作如此重要深胳,我們應(yīng)該將它添加到版本控制里。

點(diǎn)擊前往CocoaPods官網(wǎng)查看對(duì)Podfile.lock的介紹铜犬。

補(bǔ)充:有時(shí)執(zhí)行pod update命令會(huì)特別慢舞终,可以嘗試使用如下命令:
$ pod update --verbose --no-repo-update
pod install命令同理:
$ pod install --verbose --no-repo-update

發(fā)布自己的開(kāi)源框架到CocoaPods

你需要如下圖創(chuàng)建一個(gè)Framework來(lái)打造你自己的開(kāi)源框架


Framework

在工程目錄下添加一份開(kāi)源協(xié)議文件,一般為“LICENSE”癣猾,在 github 上新建倉(cāng)庫(kù)時(shí)可以同時(shí)新建 README.md 文件及 LICENSE 文件敛劝。

在開(kāi)始之前你應(yīng)當(dāng)使用郵箱賬號(hào)注冊(cè) CocoaPods

$ pod trunk register my_name@example.com 'my_name' --description='macbook pro'

隨后會(huì)收到一份驗(yàn)證郵件,點(diǎn)擊鏈接進(jìn)行驗(yàn)證纷宇,之后通過(guò)以下命令查看注冊(cè)結(jié)果:

$ pod trunk me

結(jié)果應(yīng)為:

  - Name:     my_name
  - Email:    my_name@example.com
  - Since:    August 28th, 05:45
  - Pods:
    - my_framework_name
  - Sessions:
    - August 28th, 05:45 - January 3rd, 2018 10:00. IP: 116.226.129.252
    Description: macbook pro

加下來(lái)就是正式開(kāi)始推送自己的框架到 CocoaPods夸盟,
發(fā)布自己的開(kāi)源框架到CocoaPods同樣需要一個(gè)類(lèi)似Podfile的文件來(lái)告訴CocoaPods我們開(kāi)源庫(kù)的名稱、版本像捶、作者上陕、描述桩砰、地址、所需的framework释簿、依賴庫(kù)等亚隅,這個(gè)文件叫my_framework_name.podspec,開(kāi)始創(chuàng)建這個(gè)文件

終端cd到工程目錄下庶溶,執(zhí)行如下命令:

$ pod spec create my_framework_name

這樣在你的工程目錄下會(huì)生成一個(gè)my_framework_name.podspec文件煮纵,大概內(nèi)容為(將對(duì)應(yīng)名稱修改為你自己的):

Pod::Spec.new do |s|
  s.name         = "DJLSplitCollectionView"
  s.summary      = "It is my first framework."
  s.version      = "0.0.1"
  s.license      = { :type => 'MIT', :file => 'LICENSE' }
  s.author       = { "gonghonglou" => "gonghonglou@gmail.com" }
  s.social_media_url = 'http://gonghonglou.com'
  s.homepage     = "https://github.com/gonghonglou/DJLSplitCollectionView"
  s.platform     = :ios, '8.0'
  s.ios.deployment_target = '8.0'
  s.source       = { :git => "https://github.com/gonghonglou/DJLSplitCollectionView.git", :tag => s.version.to_s }
  
  s.requires_arc = true
  s.source_files = 'DJLSplitCollectionView/*.{h,m}'
  s.public_header_files = 'DJLSplitCollectionView/*.{h}'

  s.framework  = "UIKit"

end

然后執(zhí)行如下命令

$ git tag 0.0.1 // 給框架打上 tag
$ git push origin --tags    // 將 tag 推送到 github

檢查 podspec 語(yǔ)法和項(xiàng)目是否正常編譯,執(zhí)行如下命令:

$ pod spec lint my_framework_name.podspec

確保沒(méi)有任何 error 和 warning 偏螺,然后推送 podspec 到 CocoaPods 的主倉(cāng)庫(kù)就可以了

$ pod trunk push my_framework_name.podspec    // 提交到 CocoaPods 中心倉(cāng)庫(kù)

成功后結(jié)果應(yīng)該為:

Updating spec repo `master`
Validating podspec
 -> DJLSplitCollectionView (0.0.1)

Updating spec repo `master`

--------------------------------------------------------------------------------
 ??  Congrats

 ??  DJLSplitCollectionView (0.0.1) successfully published
 ??  August 28th, 09:39
 ??  https://cocoapods.org/pods/DJLSplitCollectionView
 ??  Tell your friends!
--------------------------------------------------------------------------------

如圖:

cocoapods_push-1.png

大功告成行疏,幾秒或者幾分鐘后 pod search my_framework_name 搜索一下吧~
如果搜不到的話,建議執(zhí)行如下方法:

rm ~/Library/Caches/CocoaPods/search_index.json
pod search my_framework_name

后記

參考鏈接

最后編輯于
?著作權(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)離奇詭異,居然都是意外死亡磨取,警方通過(guò)查閱死者的電腦和手機(jī)人柿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)忙厌,“玉大人凫岖,你說(shuō)我怎么就攤上這事》昃唬” “怎么了哥放?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)爹土。 經(jīng)常有香客問(wèn)我甥雕,道長(zhǎng),這世上最難降的妖魔是什么胀茵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任社露,我火速辦了婚禮,結(jié)果婚禮上琼娘,老公的妹妹穿的比我還像新娘峭弟。我一直安慰自己附鸽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布孟害。 她就那樣靜靜地躺著拒炎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挨务。 梳的紋絲不亂的頭發(fā)上击你,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音谎柄,去河邊找鬼丁侄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛朝巫,可吹牛的內(nèi)容都是我干的鸿摇。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼劈猿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拙吉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起揪荣,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤筷黔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后仗颈,有當(dāng)?shù)厝嗽跇?shù)林里發(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
  • 文/蒙蒙 一胆筒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦仆救、人聲如沸抒和。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)摧莽。三九已至,卻和暖如春顿痪,著一層夾襖步出監(jiān)牢的瞬間镊辕,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工蚁袭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留征懈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓揩悄,卻偏偏與公主長(zhǎng)得像卖哎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子删性,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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