iOS CocoaPods詳細(xì)教程

CocoaPods簡(jiǎn)介

CocoaPods是一個(gè)負(fù)責(zé)管理iOS項(xiàng)目中第三方開源庫(kù)的工具。CocoaPods的項(xiàng)目源碼在Github上管理。該項(xiàng)目開始于2011年8月12日,在這兩年多的時(shí)間里,它持續(xù)保持活躍更新。開發(fā)iOS項(xiàng)目不可避免地要使用第三方開源庫(kù),CocoaPods的出現(xiàn)使得我們可以節(jié)省設(shè)置和更新第三方開源庫(kù)的時(shí)間

在我們有了CocoaPods (https://github.com/CocoaPods/CocoaPods) 這個(gè)工具之后,只需要將用到的第三方開源庫(kù)放到一個(gè)名為Podfile的文件中,然后在命令行執(zhí)行$ pod install命令。CocoaPods就會(huì)自動(dòng)將這些第三方開源庫(kù)的源碼下載下來(lái),并且為我們的工程設(shè)置好相應(yīng)的系統(tǒng)依賴和編譯參數(shù)。

一、CocoaPods 的安裝

CocoaPods基于Ruby語(yǔ)言開發(fā)而成,因此安裝CocoaPods前需要安裝Ruby環(huán)境。幸運(yùn)的是Mac系統(tǒng)默認(rèn)自帶Ruby環(huán)境,如果沒有請(qǐng)自行查找安裝。檢測(cè)是否安裝Ruby:
$ gem -v
安裝則會(huì)提示當(dāng)前Ruby版本。

1、RubyGems換源

RubyGems是什么呢?下面是官網(wǎng)給出的一段介紹:

The RubyGems software allows you to easily download, install, and use ruby software packages on your system. The software package is called a “gem” and contains a package Ruby application or library.

Gems can be used to extend or modify functionality in Ruby applications. Commonly they’re used to distribute reusable functionality that is shared with other Rubyists for use in their applications and libraries. Some gems provide command line utilities to help automate tasks and speed up your work.

通俗地來(lái)講RubyGems就像是一個(gè)倉(cāng)庫(kù),里面包含了各種軟件的包(如Cocoapods、MySql),可以通過(guò)命令行的方式來(lái)安裝這些軟件包,最為方便的是自動(dòng)幫你配置好軟件依賴的環(huán)境,整個(gè)安裝過(guò)程僅僅只需要幾行命令行。

我們?cè)诎惭bCocoaPods的時(shí)候,就是通過(guò)rubygems來(lái)安裝的,由于在國(guó)內(nèi)訪問(wèn)rubygems非常慢,所以替換rubygems鏡像源就顯得十分必要了。之前很多人用的都是淘寶的鏡像源,現(xiàn)在淘寶的rubygems鏡像源交給Ruby China來(lái)維護(hù)了,替換rubygems鏡像源的命令行如下:

$ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ (這里是需要替換的原來(lái)的鏡像源)
$ gem sources -l
https://gems.ruby-china.org
//確保只有 gems.ruby-china.org

列出gem sources.png

2、更新升級(jí) Gem 版本

Gem是管理Ruby庫(kù)和程序的標(biāo)準(zhǔn)包,如果它的版本過(guò)低也可能導(dǎo)致安裝失敗,解決方案自然是升級(jí)Gem,執(zhí)行下述命令即可:

// 更新升級(jí)gem
$ sudo gem update --system

更新升級(jí)gem.png

3、更新升級(jí) Ruby 版本

在進(jìn)行CococaPods安裝的時(shí)候,遇到錯(cuò)誤,錯(cuò)誤提示大致意思是ruby版本太低,需要升級(jí)至2.2.2以上.果然,在終端使用ruby -v查看版本為2.0.

A. 使用RVM也就是Ruby Version Manager,Ruby版本管理器來(lái)升級(jí)ruby,RVM包含了Ruby的版本管理和Gem庫(kù)管理(gemset)。
a. RVM安裝
$ curl -L get.rvm.io | bash -s stable

RVM安裝.png

b. 安裝成功之后,執(zhí)行下面命令進(jìn)行驗(yàn)證。
$ source ~/.bashrc
$ source ~/.bash_profile

進(jìn)行驗(yàn)證.png

c. 無(wú)異常,測(cè)試是否安裝正常。
$ rvm -v

打印rvm版本號(hào).png

如果出現(xiàn)rvm(版本號(hào))就算是安裝RVM成功了。

d. 列出已知ruby的版本。
$ rvm list known

列出已知ruby的版本.png

稍等一下,會(huì)出現(xiàn)很多平臺(tái)不同的ruby的版本,因?yàn)槭切枰?.2.2以上的版本,所以直接安裝2.4.0版本。

e. 安裝ruby 2.4.0
$ rvm install 2.4.0

安裝ruby 2.4.0.png

安裝完之后,可以ruby -v 測(cè)試一下,看看版本有沒有變化。

f. ruby和gem的關(guān)系。

RubyGems 是 Ruby 的一個(gè)包管理器,它提供一個(gè)分發(fā) Ruby 程序和庫(kù)的標(biāo)準(zhǔn)格式,還提供一個(gè)管理程序包安裝的工具。
RubyGems 旨在方便地管理 gem 安裝的工具,以及用于分發(fā) gem 的服務(wù)器。這類似于 Ubuntu 下的apt-get, Centos 的 yum,Python 的 pip。
RubyGems大約創(chuàng)建于2003年11月,從Ruby 1.9版起成為Ruby標(biāo)準(zhǔn)庫(kù)的一部分。所以當(dāng)我們更新了ruby版本之后發(fā)現(xiàn)gem版本號(hào)也變成了最新的2.6.10。

4、安裝CocoaPods

// 安裝CocoaPods(OS X 10.11以前)
$ sudo gem install cocoapods
// 安裝CocoaPods(10.11后蘋果升級(jí)了安全策略)
$ sudo gem install -n /usr/local/bin cocoapods

如果換成國(guó)內(nèi)鏡像使用 gem install cocoapods 報(bào)錯(cuò):
ERROR: While executing gem ... (Gem::DependencyError) Unable to resolve dependencies: cocoapods requires cocoapods-core (= 1.1.1), cocoapods-downloader (< 2.0, >= 1.1.2), cocoapods-trunk (< 2.0, >= 1.1.1), xcodeproj (< 2.0, >= 1.3.3)
說(shuō)明Gem版本太低需要更新則執(zhí)行:
$ sudo gem update --system

然后執(zhí)行以下命令:
$ sudo gem install cocoapods

如果報(bào)錯(cuò):
ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/xcodeproj

執(zhí)行:
sudo gem install -n /usr/local/bin cocoapods

安裝完成,輸入以下命令檢測(cè)是否安裝成功:
$ pod --version

5、更換repo鏡像

所有的項(xiàng)目的Podspec文件都托管在https://github.com/CocoaPods/Specs 第一次執(zhí)行pod setup時(shí),CocoaPods會(huì)將這些podspec索引文件更新到本地的 /.cocoapods/目錄下,這個(gè)索引文件比較大,有380M左右,大概花了我3個(gè)多小時(shí),噗 想知道為什么慢的原因可以參考這篇博文http://www.cocoachina.com/ios/20170208/18645.html

在github上設(shè)置pod.png

正式因?yàn)槿绱寺腥嗽趃itcafe、oschina和coding上建立了CocoaPods索引庫(kù)的鏡像,因?yàn)樗麄兌际菄?guó)內(nèi)的服務(wù)器,所以在執(zhí)行索引更新操作時(shí),會(huì)快很多。如下操作可以將CocoaPods設(shè)置成使用國(guó)內(nèi)鏡像源:

// 1.移除原有服務(wù)器

  • pod repo remove master
移除原有repo服務(wù)器.png

// 2.添加境內(nèi)服務(wù)器

clone境內(nèi)repo服務(wù)器.png

另外,在自己工程中的Podfile文件加入下面一行描述:
source 'https://git.coding.net/hging/Specs.git'

添加默認(rèn)鏡像源描述.png

如果不加這一句話,它默認(rèn)還是從github鏡像源地址去下載的,這個(gè)不要給忘記了。

注意點(diǎn):

  • master repo里面存放的是所有第三方庫(kù)的地址列表,下載第三方庫(kù)對(duì)應(yīng)的源碼還是要到指定的源碼存放地址(podspecs中有指定)去下載。更換repo源只是加快了repo的下載速度,并不會(huì)加快第三方庫(kù)源碼的下載速度,兩者是沒有任何關(guān)系的。
  • 在工程中盡量避免直接使用pod update、pod install,在后面添加--no-repo-update后使用。
  • 工程中依賴第三方庫(kù)版本過(guò)低,可以先到repos目錄下,使用git clone更新master repo,然后在工程中使用pod update --no-repo-update命令。

上面提到的方案從一定程度上加快了CocoaPods的執(zhí)行速度,但是仍然避免不了要更新全部repo的情況,而實(shí)際情況是我們項(xiàng)目當(dāng)中用到的第三方庫(kù)大部分只需要十幾個(gè),大量的時(shí)間被浪費(fèi)在我們不需要的庫(kù)上面了。因?yàn)镃ocoaPods是使用中心化的方式來(lái)進(jìn)行管理的,所以當(dāng)?shù)谌綆?kù)多起來(lái)的時(shí)候,就會(huì)出現(xiàn)剛才的情況,這個(gè)時(shí)候可以選擇使用Carthage來(lái)管理第三方庫(kù),它比CocoaPods最大的優(yōu)勢(shì)就在于去中心化的方式來(lái)管理,不過(guò)Carthage的缺點(diǎn)是里面的庫(kù)還不是很豐富,不過(guò)隨著時(shí)間的推移就不是問(wèn)題了。

二、CocoaPods 的使用

1、新建 Podfile 文件

使用時(shí)需要在你的項(xiàng)目根目錄下新建一個(gè)名為Podfile的文件,將依賴的庫(kù)名字依次列在文件中即可。
//進(jìn)入你的工程目錄
$ cd /Users/***/Demo
//創(chuàng)建Pods文件
$ touch Podfile

2、編輯 Podfile 文件
假設(shè)我們想導(dǎo)入 AFNetworking ,進(jìn)入http://cocoapods.org, 搜索AFNetworking。

搜索AFNetworking.png

//在工程中添加第三方
$ vim Podfile

Podfile 文件的使用方法官方已經(jīng)更新,格式如下:

  platform :ios, "8.0"

  target '工程名' do

  pod 'AFNetworking'
  end

target 后面接的是你的工程的名字
在文本編輯界面按ESC切換為末行模式輸入:wq按下回車返回終端命令行輸入

配置Podfile信息.png

3、執(zhí)行導(dǎo)入命令
進(jìn)入根目錄執(zhí)行:

  • $ pod install
成功導(dǎo)入第三方庫(kù)信息.png

pod install命令執(zhí)行成功后,會(huì)看到工程目錄下多出Foream.xcworkspace、Podfile.lock文件和Pods目錄。再看看剛才執(zhí)行完pod install命令打印出來(lái)的內(nèi)容的最后一行:From now on use Foream.xcworkspace.提示我們從現(xiàn)在起,我們需要使用Foream.xcworkspace文件來(lái)開發(fā)。

//更新 CocoaPods 或者以前手動(dòng)添加過(guò)第三方SDK改用Cocopods,可能會(huì)出現(xiàn)以下的錯(cuò)誤:

  • [!] The Foream [Release] target overrides the HEADER_SEARCH_PATHS build setting defined in `Pods/Target Support Files/Pods-Foream/Pods-Foream.release.xcconfig'. This can lead to problems with the CocoaPods installation
    • Use the $(inherited) flag, or
    • Remove the build settings from the target.

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

打開.xcworkspace工程設(shè)置,分別在我的項(xiàng)目中定義PODS_ROOT 和 Other Linker Flags的地方,把他們的值用$(inherited)替換掉,或者

      Build Setting --> HEADER_SEARCH_PATHS--> 添加$(inherited)
      Build Setting --> LIBRARY_SEARCH_PATHS--> 添加$(inherited)

進(jìn)入終端,執(zhí)行

  pod update

警告沒了

一種簡(jiǎn)單粗暴的方法:

點(diǎn)擊項(xiàng)目文件 project.xcodeproj,右鍵顯示包內(nèi)容,用文本編輯器打開project.pbxproj,刪除OTHER_LDFLAGS的地方,保存,pod update,警告沒了。。。。

4、第三方庫(kù)更新

只需要在Podfile文件中添加相應(yīng)的第三方庫(kù)信息,執(zhí)行pod update命令即可。

更新MJRefresh.png
pod update.png

5、文件和指令說(shuō)明

  • Podfile.lock文件
    • 最后一次更新Pods時(shí), 所有第三方框架的版本號(hào)
  • 常用指令的區(qū)別
    • pod install
      • 會(huì)根據(jù)Podfile.lock文件中列舉的版本號(hào)來(lái)安裝第三方框架
      • 如果一開始Podfile.lock文件不存在, 就會(huì)按照Podfile文件列舉的版本號(hào)來(lái)安裝第三方框架
      • 安裝框架之前, 默認(rèn)會(huì)執(zhí)行pod repo update指令
    • pod update
      • 將所有第三方框架更新到最新版本, 并且創(chuàng)建一個(gè)新的Podfile.lock文件
      • 安裝框架之前, 默認(rèn)會(huì)執(zhí)行pod repo update指令
    • pod install --no-repo-update
    • pod update --no-repo-update
      • 安裝框架之前, 不會(huì)執(zhí)行pod repo update指令
  • 關(guān)于Podfile文件編輯時(shí),第三方庫(kù)版本號(hào)的各種寫法
    pod ‘AFNetworking’ //不顯式指定依賴庫(kù)版本,表示每次都獲取最新版本
    pod ‘AFNetworking’, ‘2.0’ //只使用2.0版本
    pod ‘AFNetworking’, ‘>2.0′ //使用高于2.0的版本
    pod ‘AFNetworking’, ‘>=2.0′ //使用大于或等于2.0的版本
    pod ‘AFNetworking’, ‘<2.0′ //使用小于2.0的版本
    pod ‘AFNetworking’, ‘<=2.0′ //使用小于或等于2.0的版本
    pod ‘AFNetworking’, ‘~>0.1.2′ //使用大于等于0.1.2但小于0.2的版本,相當(dāng)于>=0.1.2并且<0.2.0
    pod ‘AFNetworking’, ‘~>0.1′ //使用大于等于0.1但小于1.0的版本
    pod ‘AFNetworking’, ‘~>0′ //高于0的版本,寫這個(gè)限制和什么都不寫是一個(gè)效果,都表示使用最新版本

寫作此博文時(shí)大量參考了以下文章:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • CocoaPods 是什么? CocoaPods 是一個(gè)負(fù)責(zé)管理 iOS 項(xiàng)目中第三方開源庫(kù)的工具。CocoaPo...
    朝洋閱讀 25,742評(píng)論 3 50
  • 項(xiàng)目組件化、平臺(tái)化是技術(shù)公司的共同目標(biāo),越來(lái)越多的技術(shù)公司推崇使用pod管理第三方庫(kù)以及私有組件,一方面使項(xiàng)目架構(gòu)...
    swu_luo閱讀 22,226評(píng)論 0 39
  • 我們所記錄的,都是已知的 我們所幻想的,都是不曾擁有的 能用什么去表達(dá)深刻? 地球偽裝成太陽(yáng)的中心 痛苦偽裝成幸福...
    之蛇閱讀 305評(píng)論 0 1
  • 馬列死雜狗,為什么都這么惡心?
    孫大圣_8a6e閱讀 122評(píng)論 0 0
  • 在生活中,大多數(shù)人并沒有嚴(yán)格去區(qū)分家人、愛人、親人這樣的概念。 很多時(shí)候在使用時(shí)并沒有多大差別,可它們之間確實(shí)有一...
    C小呆閱讀 497評(píng)論 0 1