iOS CocoaPods詳細教程

CocoaPods簡介

CocoaPods是一個負責管理iOS項目中第三方開源庫的工具。CocoaPods的項目源碼在Github上管理。該項目開始于2011年8月12日,在這兩年多的時間里,它持續保持活躍更新。開發iOS項目不可避免地要使用第三方開源庫,CocoaPods的出現使得我們可以節省設置和更新第三方開源庫的時間

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

一、CocoaPods 的安裝

CocoaPods基于Ruby語言開發而成,因此安裝CocoaPods前需要安裝Ruby環境。幸運的是Mac系統默認自帶Ruby環境,如果沒有請自行查找安裝。檢測是否安裝Ruby:
$ gem -v
安裝則會提示當前Ruby版本。

1、RubyGems換源

RubyGems是什么呢?下面是官網給出的一段介紹:

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.

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

我們在安裝CocoaPods的時候,就是通過rubygems來安裝的,由于在國內訪問rubygems非常慢,所以替換rubygems鏡像源就顯得十分必要了。之前很多人用的都是淘寶的鏡像源,現在淘寶的rubygems鏡像源交給Ruby China來維護了,替換rubygems鏡像源的命令行如下:

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

列出gem sources.png

2、更新升級 Gem 版本

Gem是管理Ruby庫和程序的標準包,如果它的版本過低也可能導致安裝失敗,解決方案自然是升級Gem,執行下述命令即可:

// 更新升級gem
$ sudo gem update --system

更新升級gem.png

3、更新升級 Ruby 版本

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

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

RVM安裝.png

b. 安裝成功之后,執行下面命令進行驗證。
$ source ~/.bashrc
$ source ~/.bash_profile

進行驗證.png

c. 無異常,測試是否安裝正常。
$ rvm -v

打印rvm版本號.png

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

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

列出已知ruby的版本.png

稍等一下,會出現很多平臺不同的ruby的版本,因為是需要2.2.2以上的版本,所以直接安裝2.4.0版本。

e. 安裝ruby 2.4.0
$ rvm install 2.4.0

安裝ruby 2.4.0.png

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

f. ruby和gem的關系。

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

4、安裝CocoaPods

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

如果換成國內鏡像使用 gem install cocoapods 報錯:
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)
說明Gem版本太低需要更新則執行:
$ sudo gem update --system

然后執行以下命令:
$ sudo gem install cocoapods

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

執行:
sudo gem install -n /usr/local/bin cocoapods

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

5、更換repo鏡像

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

在github上設置pod.png

正式因為如此慢,有人在gitcafe、oschina和coding上建立了CocoaPods索引庫的鏡像,因為他們都是國內的服務器,所以在執行索引更新操作時,會快很多。如下操作可以將CocoaPods設置成使用國內鏡像源:

// 1.移除原有服務器

  • pod repo remove master
移除原有repo服務器.png

// 2.添加境內服務器

clone境內repo服務器.png

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

添加默認鏡像源描述.png

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

注意點:

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

上面提到的方案從一定程度上加快了CocoaPods的執行速度,但是仍然避免不了要更新全部repo的情況,而實際情況是我們項目當中用到的第三方庫大部分只需要十幾個,大量的時間被浪費在我們不需要的庫上面了。因為CocoaPods是使用中心化的方式來進行管理的,所以當第三方庫多起來的時候,就會出現剛才的情況,這個時候可以選擇使用Carthage來管理第三方庫,它比CocoaPods最大的優勢就在于去中心化的方式來管理,不過Carthage的缺點是里面的庫還不是很豐富,不過隨著時間的推移就不是問題了。

二、CocoaPods 的使用

1、新建 Podfile 文件

使用時需要在你的項目根目錄下新建一個名為Podfile的文件,將依賴的庫名字依次列在文件中即可。
//進入你的工程目錄
$ cd /Users/***/Demo
//創建Pods文件
$ touch Podfile

2、編輯 Podfile 文件
假設我們想導入 AFNetworking ,進入http://cocoapods.org, 搜索AFNetworking。

搜索AFNetworking.png

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

Podfile 文件的使用方法官方已經更新,格式如下:

  platform :ios, "8.0"

  target '工程名' do

  pod 'AFNetworking'
  end

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

配置Podfile信息.png

3、執行導入命令
進入根目錄執行:

  • $ pod install
成功導入第三方庫信息.png

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

//更新 CocoaPods 或者以前手動添加過第三方SDK改用Cocopods,可能會出現以下的錯誤:

  • [!] 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.

產生此警告的原因是項目 Target 中的一些設置,CocoaPods 也做了默認的設置,如果兩個設置結果不一致,就會造成問題。

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

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

進入終端,執行

  pod update

警告沒了

一種簡單粗暴的方法:

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

4、第三方庫更新

只需要在Podfile文件中添加相應的第三方庫信息,執行pod update命令即可。

更新MJRefresh.png
pod update.png

5、文件和指令說明

  • Podfile.lock文件
    • 最后一次更新Pods時, 所有第三方框架的版本號
  • 常用指令的區別
    • pod install
      • 會根據Podfile.lock文件中列舉的版本號來安裝第三方框架
      • 如果一開始Podfile.lock文件不存在, 就會按照Podfile文件列舉的版本號來安裝第三方框架
      • 安裝框架之前, 默認會執行pod repo update指令
    • pod update
      • 將所有第三方框架更新到最新版本, 并且創建一個新的Podfile.lock文件
      • 安裝框架之前, 默認會執行pod repo update指令
    • pod install --no-repo-update
    • pod update --no-repo-update
      • 安裝框架之前, 不會執行pod repo update指令
  • 關于Podfile文件編輯時,第三方庫版本號的各種寫法
    pod ‘AFNetworking’ //不顯式指定依賴庫版本,表示每次都獲取最新版本
    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的版本,相當于>=0.1.2并且<0.2.0
    pod ‘AFNetworking’, ‘~>0.1′ //使用大于等于0.1但小于1.0的版本
    pod ‘AFNetworking’, ‘~>0′ //高于0的版本,寫這個限制和什么都不寫是一個效果,都表示使用最新版本

寫作此博文時大量參考了以下文章:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內容

  • CocoaPods 是什么? CocoaPods 是一個負責管理 iOS 項目中第三方開源庫的工具。CocoaPo...
    朝洋閱讀 25,727評論 3 51
  • 項目組件化、平臺化是技術公司的共同目標,越來越多的技術公司推崇使用pod管理第三方庫以及私有組件,一方面使項目架構...
    swu_luo閱讀 22,047評論 0 39
  • 我們所記錄的,都是已知的 我們所幻想的,都是不曾擁有的 能用什么去表達深刻? 地球偽裝成太陽的中心 痛苦偽裝成幸福...
    之蛇閱讀 305評論 0 1
  • 馬列死雜狗,為什么都這么惡心?
    孫大圣_8a6e閱讀 121評論 0 0
  • 在生活中,大多數人并沒有嚴格去區分家人、愛人、親人這樣的概念。 很多時候在使用時并沒有多大差別,可它們之間確實有一...
    C小呆閱讀 475評論 0 1