CocoaPods(封裝庫管理控件)

寫在前面:如果你是首次使用CocoaPods,目標(biāo)是快準(zhǔn)狠的安裝和使用,可以直接看安裝、具體使用、使用補充三部分快速上手嘗鮮。有一定經(jīng)驗后回來具體看看每部指令的含義,你會對CocoaPods了解越來越深~

一、CocoaPods簡介:

CocoaPods是負責(zé)管理iOS項目中第三方開源庫的工具,CocoaPods能讓我們集中、統(tǒng)一管理第三方開源庫,為我們節(jié)省設(shè)置和更新第三方開源庫的時間。

二、CocoaPods安裝:

在正式開始介紹安裝CocoaPods,溫馨提示如下:

  1. 操作命令中間可能有空格看不出來,建議直接復(fù)制粘貼執(zhí)行;

  2. CocoaPods是由ruby語言編寫的。我們需要通過Ruby來安裝CocoaPods(至于為什么,我百度過也不知道原因,知道的朋友可以留言~)。然后因為Mac電腦自帶Ruby環(huán)境,我們就只需打開終端開始動手。但是默認情況下mac系統(tǒng)自帶的Ruby環(huán)境版本比較低(大概是2.0.0版本的),現(xiàn)在安裝CocoaPods需要2.2.2版本及以上的,所以我們不管三七二十一先直接先升級ruby。

  3. 安裝CocoaPods整體思路是:更新ruby->設(shè)置CocoaPods下載地址->下載并安裝CocoaPods->使用CocoaPods

正式安裝:

1、打開終端(不會的請自行百度)

2、查看當(dāng)前Ruby版本(一般都是2.0.0,如果已經(jīng)是最新版本的,可以跳過2-7兩步)

ruby -v

3、升級Ruby環(huán)境,需要借助rvm(rvm是一個便捷的多版本ruby環(huán)境的管理和切換工具)。安裝rvm(第一步要下載一些東西等兩分鐘左右);有rvm可以跳過3、4步,不確定可執(zhí)行第4步檢查

curl -L get.rvm.io | bash -s stable 

source ~/.bashrc

source ~/.bash_profile

4、查看rvm版本(有版本號就表示安裝成功)

rvm -v 

5、檢出ruby可安裝的版本信息

rvm list known

6、安裝一個ruby版本(可以是2.4.1版本,當(dāng)然你也可以選擇其他的)

rvm install 2.4.1

7、設(shè)置為默認版本

rvm use 2.4.1 --default

8、更換源(由于國內(nèi)訪問的CocoaPods國外下載路徑被墻,我們需要來修改更換源,把源切換至ruby-china;網(wǎng)上大多數(shù)是使用的https://ruby.taobao.org的,這里不再建議使用的了,這是因為taobao Gems 源已停止維護,現(xiàn)由 ruby-china 提供鏡像服務(wù))

sudo gem update --system // 更新gem

gem sources --remove https://rubygems.org/ // 移除舊有鏡像資源地址

gem sources -a https://gems.ruby-china.org/ // 添加新的鏡像資源地址

9、為了驗證你的Ruby鏡像是并且僅是ruby-china,執(zhí)行以下命令查看

gem sources -l

如果是以下結(jié)果說明正確,如果有其他的請自行百度解決

*** CURRENT SOURCES ***

https://gems.ruby-china.org/

10、終于正式安裝CocoaPods

sudo gem install cocoapods
sudo gem install -n /usr/local/bin cocoapods // macOS 10.11系統(tǒng)后使用。現(xiàn)在基本上用這個命令

11、如果安裝了多個Xcode使用下面的命令選擇(一般需要選擇最近的Xcode版本)

sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer

12、初始化本地庫(作用:將CocoaPods記錄的所有第三方庫下載信息下載到本地~/.cocoapods/repos/master下面)

pod setup

13、執(zhí)行以上命令后會輸出一句話:Setting up CocoaPods master repo,然后就是漫長的等待,并不是卡死了而是在下載文件(下載完成后大概800多兆)。網(wǎng)速稍好些,幾分鐘就好了,人品不好網(wǎng)絡(luò)差的可能會等很久很久很久........

查看文件下載進度的可以另外打開一個終端窗口(快捷鍵:選中終端按下Command+N組合鍵),復(fù)制粘貼以下兩行命令回車執(zhí)行

cd ~/.cocoapods
du -sh *

執(zhí)行du -sh *之后會顯示已下載的文件大小,可以多次執(zhí)行來監(jiān)看下載進度,如果之前還有文件大小,后來變成0了,可能是網(wǎng)絡(luò)問題,下載已經(jīng)中斷了,需要結(jié)束命令并從新執(zhí)行 pod setup

網(wǎng)上有文章說可以將別人機器上~/.cocoapods/repos/master下面的文件copy到自己電腦上的文件里可以跳過這步,本人親測過,或多或少都有點問題。如果復(fù)制后,執(zhí)行pod setup依然會清空原來內(nèi)容重新下載,而不是智能的根據(jù)已下載的內(nèi)容走剩下的流程,白復(fù)制,所以還是乖乖下載吧。

14、下載安裝完成之后可執(zhí)行下列命令檢查是否可用(第一次使用要等一會,因為這個時候CocoaPods需要生成本地的封裝庫搜索文件目錄);

pod search AFNetworking

如果是以下結(jié)果說明正確,如果有其他的請自行百度解決;AFNetworking+AutoRetry (0.0.5)不是我們要找的,AFNetworking (3.1.0)才是。退出搜索結(jié)果界面輸入wq

-> AFNetworking (3.1.0)
   A delightful iOS and OS X networking framework.
   pod 'AFNetworking', '~> 3.1.0'
   - Homepage: https://github.com/AFNetworking/AFNetworking
   - Source:   https://github.com/AFNetworking/AFNetworking.git
   - Versions: 3.1.0, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3,
   3.0.0-beta.2, 3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1, 2.6.0, 2.5.4, 2.5.3, 2.5.2,
   2.5.1, 2.5.0, 2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0,
   2.1.0, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1, 1.3.4,
   1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0, 1.0.1, 1.0, 1.0RC3, 1.0RC2,
   1.0RC1, 0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, 0.5.1 [master repo]
   - Subspecs:
     - AFNetworking/Serialization (3.1.0)
     - AFNetworking/Security (3.1.0)
     - AFNetworking/Reachability (3.1.0)
     - AFNetworking/NSURLSession (3.1.0)
     - AFNetworking/UIKit (3.1.0)

-> AFNetworking+AutoRetry (0.0.5)
   Auto Retries for AFNetworking requests
   pod 'AFNetworking+AutoRetry', '~> 0.0.5'
   - Homepage: https://github.com/shaioz/AFNetworking-AutoRetry

三、CocoaPods的使用

1、 新建一個Xcode工程,使用終端cd到工程目錄下(項目的.xcodeproj同級文件夾)

2、創(chuàng)建Podfile文件:

pod init

之后就可以在項目目錄里看到一個Podfile文件

3、命令行打開Podfile文件或直接雙擊打開Podfile文件:

open Podfile

4、添加需要的第三方庫(以AFNetworking為例),在打開的Podfile最下面添加以下內(nèi)容:

pod 'AFNetworking' // 這里示范,所以不指定版本號,就是下載最新的第三方庫。

// pod 'AFNetworking', '~> 3.1.0' // 實際工作中,必須要指定版本。

5、保存(command + S)后退出

6、開始下載:

pod install --no-repo-update

終端的結(jié)果沒有紅色的內(nèi)容,基本上安裝成功了。

7、打開.xcworkspace。一開始如果不習(xí)慣CocoaPods,往往會繼續(xù)打開.xcodeproj運行工程,然后成功報錯的哦。使用CocoaPods 需要打開.xcworkspace才能成功運行工程~

8、卸載CocoaPods。雖然很少用到,但貼心附上卸載CocoaPods的命令:

sudo gem uninstall cocoapods

四、CocoaPods具體使用補充

1、 podfile文件內(nèi)容簡單介紹:

// 用來設(shè)置所有第三方庫所支持的iOS最低版本
platform :ios, '7.0'

target 'test' do // test是項目名

// 如果是swift項目,這句話保留;如果是OC項目,這句話要刪除
use_frameworks!

// 添加第三方類庫
pod 'AFNetworking'

// 添加指定版本號的第三方類庫
pod 'SVProgressHUD', '1.1.3'

2、 版本說明

// 設(shè)置框架的名稱和版本號
pod 'SDWebImage','~>3.7.5'//任何高于或等于3.7.5的版本,但是不包含高于4.0.0版本

//  版本號的規(guī)則:
//  '>1.0'    可以安裝任何高于1.0的版本
//  '>=1.0'   可以安裝任何高于或等于1.0的版本
//  '<1.0'    任何低于1.0的版本
//  '<=1.0'   任何低于或等于1.0的版本
//  '~>0.1'   任何高于或等于0.1的版本,但是不包含高于1.0的版本
//  '~>0'     任何版本,相當(dāng)于不指定版本,默認采用最新版本號

溫馨提示:

  1. 工作中建議使用'~>0 .1' 方式指定版本號,不建議不指定版本號。因為版本號的命名規(guī)則,每個0.01版本增加,一般是bug修復(fù)等小改動;每個0.1版本增加是引入或更新新的第三方庫,或增加新的小功能等;每個1.0版本增加往往是大的新功能增加或者變量、方法命名等有大改變,往往對我們引用造成很大影響,因為可能要調(diào)整項目中的代碼。如果不指示版本號,就會容易出現(xiàn)下載超過大于1.0版本的第三方庫,出現(xiàn)不可知問題哦。
  1. 指定版本號也方便知道目前引用的第三方庫大概是什么版本號,當(dāng)然具體的可以到podfile.lock中查看。這遠比手工拖入第三方庫好的多。畢竟如果你手工拖入第三方庫,并且沒有做任何標(biāo)示,天知道你下載的是哪個版本的,后續(xù)維護就是一個巨坑。本人就試過想將手工拖入的第三方庫轉(zhuǎn)移到CocoaPods中,由于不知道原版本號,只能指定最新的版本號,一運行成功,各種飄紅~

3、 podfile和podfile.lock的區(qū)別

Podfile文件:
1. 記錄本項目中的第三方庫版本要求。
2. 必須做版本管理,項目成員間保持一致。

Podfile.lock文件:
1. 記錄最后一次更新Pods時, 所有第三方框架的最終版本號。
2. 推薦做版本管理。除了項目很復(fù)雜,需要針對不同內(nèi)容使用不同第三方庫依賴時不做版本管理

4、 常用指令介紹

// 根據(jù)Podfile.lock文件中列舉的版本號來安裝第三方框架
// 如果一開始Podfile.lock文件不存在, 就會按照Podfile文件列舉的版本號來安裝第三方框架
// pod install

// 將所有第三方框架更新到最新版本, 并且創(chuàng)建一個新的Podfile.lock文件
// pod update // 更新Podfile中所有的第三方庫
// pod update PODNAME // 只更新某個特定的庫

// 上述兩個指令在執(zhí)行前默認會執(zhí)行pod repo update指令
// 長時間不更新鏡像,會出現(xiàn)pod search的結(jié)果低于實際上該第三方庫在github上的版本。這個時候就執(zhí)行該命令更新鏡像,否則就無法下載最新的第三方庫
pod repo update  

// 由于不需要經(jīng)常更新第三方庫,也沒必要一定要下載最新的第三方庫(有可能還不穩(wěn)定),另外更新鏡像很費時間,實際中往往不每次都更新鏡像,需要帶上后綴--no-repo-update,以免執(zhí)行pod repo update指令
pod install --no-repo-update // 推薦使用
// pod update --no-repo-update // 不推薦使用
pod update PODNAME --no-repo-update // 推薦使用, PODNAME應(yīng)改為具體的第三方庫庫名
        
// 檢出那些所有較Podfile.lock里面有新版本的庫(那些當(dāng)前被安裝著的庫的版本)
pod outdated 

5、 pod install & pod update區(qū)別

  • 舉個例子好說明:
// 1. 初次建立項目,Podfile中第三方庫要求如下:
pod 'SDWebImage','~>3.7.5'
pod 'AFNetworking', '~> 3.1.0'

// 2. 使用pod install --no-repo-update后,會安裝SDWebImage和AFNetworking,在Podfile.lock中版本號分別是3.7.5和3.1.0
pod install --no-repo-update

// 3. 后來AFNetworking的作者發(fā)布3.2.0最新包,SDWebImage沒變化;沒有對Podfile中第三方庫要求做任何修改

// 4.1 若此時執(zhí)行pod install --no-repo-update 
pod install --no-repo-update 
// 由于已經(jīng)有Podfile.lock,當(dāng)前已安裝的第三方庫(Podfile.lock記錄的)依然符合Podfile中要求,不會做任何處理;即當(dāng)前SDWebImage和AFNetworking,依然是3.7.5和3.1.0

// 4.2 若此時執(zhí)行pod update --no-repo-update 
pod update --no-repo-update 
// 不管有沒有Podfile.lock,CocoaPods會找遠方服務(wù)器最新的,并且符合Podfile中要求的第三方庫更新,并重新生成Podfile.lock;即當(dāng)前SDWebImage和AFNetworking,依然是3.7.5和3.2.0

// 5.要注意的是,假如項目中SDWebImage和AFNetworking,依然是3.7.5和3.1.0。遠方服務(wù)器SDWebImage和AFNetworking最新的版本是3.8.5和3.2.0
// 需要引入新的第三方庫MJExtension
pod 'MJExtension', '~> 3.0.13'

// 5.1 若只是引入MJExtension而不更新已有的庫,執(zhí)行
pod install --no-repo-update 
// 此時SDWebImage和AFNetworking,依然是3.7.5和3.1.0;并增加MJExtension(3.0.13)

// 5.2若不僅要引入MJExtension并更新已有的庫,執(zhí)行
pod update --no-repo-update
// // 此時SDWebImage和AFNetworking,升級到3.8.5和3.2.0;并增加MJExtension(3.0.13)
  1. 使用pod install/update命令安裝框架后的大致過程:

     01 分析依賴:該步驟會分析Podfile,查看不同類庫之間的依賴情況。如果有多個類庫依賴于同一個類庫,但是依賴于不同的版本,那么cocoaPods會自動設(shè)置一個兼容的版本。
     02-1 下載依賴(pod install):根據(jù)分析依賴的結(jié)果,根據(jù)Podfile.lock是否已有符合的第三方庫,若有則不下載,若無則下載指定版本的類庫到本地項目中,并更新Podfile.lock。
     02-2 下載依賴(pod update):根據(jù)分析依賴的結(jié)果,無視已有的版本庫,下載最新的指定版本的類庫到本地項目中,并更新Podfile.lock。
     03 生成Pods項目:創(chuàng)建一個Pods項目專門用來編譯和管理第三方框架,CocoaPods會將所需的框架,庫等內(nèi)容添加到項目中,并且進行相應(yīng)的配置。
     04 整合Pods項目:將Pods和項目整合到一個工作空間中,并且設(shè)置文件鏈接。
    

7、 CocoaPods specs的鏡像索引

  • CocoaPods specs的鏡像索引是指CocoaPods管理的全球所有第三方庫相關(guān)信息在本地的查詢數(shù)據(jù)。CocoaPods需要依靠本地的鏡像索引來獲取服務(wù)端中對應(yīng)的第三方庫信息(下載地址等)并進行分析下載。

  • 所有的項目的podspec文件(鏡像索引文件)都托管在https://github.com/CocoaPods/Specs上。

  • 第一次執(zhí)行pod setup時,cocoapods會將這些podspec索引文件更新到本地的 ~/。cocoapods/目錄下,這個索引文件比較大,國內(nèi)網(wǎng)絡(luò)的問題,更新非常慢。

  • 國內(nèi)很多善丈人翁就在國內(nèi)建了新的地址,并及時和國外的保持同步,大家使用之余要記得感恩,不過這些國內(nèi)的地址不時就會失效,目前最新的是https://gems.ruby-china.org

  • 使用方法:

pod repo remove master // 移除舊有鏡像資源地址
pod repo add master https://gems.ruby-china.org // 添加新的鏡像資源地址
pod repo update // 更新鏡像
  • 后續(xù)使用中進行pod repo update 時(pod update、pod install 默認執(zhí)行pod repo update命令),會去更新獲取pod specs。

8、 使用注意:不是所有的庫都可以由CocoaPods管理。需要該第三方庫擁有.podspec才行。.podspec包含了該第三方庫的名稱、版本號、下載地址、第三方庫依賴等信息。CocoaPods需要根據(jù)該信息才能找到對應(yīng)的下載地址

五、CocoaPods拓展-原理和組件化

CocoaPods原理
  • CocoaPods 背后的理念主要體現(xiàn)在兩個方面。首先,在工程中引入第三方代碼會涉及到許多內(nèi)容。針對 Objective-C初級開發(fā)者來說,工程文件的配置會讓人很沮喪。在配置buildphases和linker flags過程中,會引起許多人為因素的 錯誤。CocoaPods 簡化了這一切,它能夠自動配置編譯選項。

  • 其次,通過 CocoaPods,可以很方便的查找到新的第三方庫。當(dāng)然,這并不是 說你可以簡單的將別人提供的庫拿來拼湊成一個應(yīng)用程序。它的真正作用是讓你能夠找到真正好用的庫,以此來縮短我們的開發(fā)周期和提升軟件的質(zhì)量。

  • CocoaPods的原理,它是將所有的依賴庫都放到另一個名為Pods項目中,然后讓主項目依賴Pods項目,這樣,源碼管理工作都從主項目移到了Pods項目中
    1、Pods項目最終會編譯成一個名為libPods.a的文件,主項目只需要依賴這個.a 文件即可。
    2、對于資源文件,CocoaPods提供了一個名為Pods-resources.sh的bash腳本, 該腳本在每次項目編譯的時候都會執(zhí)行,將第三方庫的各種資源文件復(fù)制到目 標(biāo)目錄中。
    3、CocoaPods通過一個名為Pods.xcconfig的文件來在編譯時設(shè)置所有的依賴和 參數(shù)。

CocoaPods組件化

試想一下,既然CocoaPods能夠管理第三方庫,那為什么不管理公司自有的封裝庫,方便公司內(nèi)部跨app使用和測試?在這種思路下,組件化就應(yīng)運而生了。目前越來越多的公司CocoaPods來實現(xiàn)組件化。有興趣的可以自行搜一下關(guān)于組件化的內(nèi)容。

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

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