Cocoa包管理器之CocoaPods詳解


CocoaPods在Cocoa開發日常工作中經常用到的包管理器,即依賴管理工具。有的項目也有用Carthage的,Carthage是一個比較新的依賴管理工具,是使用Swift語言開發的。Carthage在上家公司的一個項目中實踐過一些,用着也挺方便。本篇博客就先系統的了解一下CocoaPods的使用方式和工作原理, 然后在下篇博客中會系統的了解一下Carthage的使用方式和工作原理,這兩個依賴倉庫系統梳理完畢后,會做一個比較。

CocoaPods是個老生常談的話題。在之前的博客中也有相關內容的涉及,但是不夠系統全面。本篇博客會系統的梳理一下CocoaPods, 但是接下來幾篇博客中會聊一些Carthage以及其源碼解析的相關內容。

(注:博客中的有些內容是自己根據具體的事例而總結出來的,有些地方如果理解偏差,還請大家進行斧正)

 

一、What is CocoaPods

首先來看一下什么是CocoaPods, 下方是CocoaPods官網上對CocoaPods的解釋。

CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It has over 45 thousand libraries and is used in over 3 million apps. CocoaPods can help you scale your projects elegantly.

上面大概意思是CocoaPodsSwiftObjective-C語言中Cocoa項目中依賴的管理工具。其中涵蓋了4.5萬個庫,被300萬個App使用。CocoaPods可以幫助你優雅的擴從你的項目。

簡單點兒說CocoaPods就是Cocoa工程中被廣泛使用的包管理器。

 

二、Install CocoaPods

看完介紹,接下來簡單看一下CocoaPods的安裝。CocoaPods的編譯和運行需要Ruby環境的支持。在OS X上已經默認安裝了Ruby環境,官方推薦使用默認的Ruby環境。

可以通過下方的命令來安裝CocoaPods。在安裝時需添加上sudo, 使用系統權限來進行安裝。下方的命令也可以用來更新CocoaPods

按照命令:sudo gem install cocoapods
卸載命令:gem uninstall cocoapods

因為我的本地之前已經安裝過CocoaPods, 下方是進行的覆蓋安裝,也相當於更新了。具體如下所示
  

 

 

三、Get Started

安裝完CocoaPods后,來看一下CocaPods的簡單使用。雖然在之前的博客中不止一次的用到CocoaPods, 但是在本篇博客安裝完CocoaPods后,接下來我們來簡單的感受一下CocoaPods的具體使用。

1、Create Podfile

CocoaPods管理的工程中通過名為Podfile的文本文件來描述相關的依賴信息。下方就是在我們已有的工程中創建了一個Podfile文件,將下方的內容輸入到文件中。在該文件中通過pod來引入相關的倉庫,后方跟的是倉庫的版本號。下方的use_frameworks!則表明依賴的庫編譯生成.frameworkds的包,而不是.a的包。

platform :ios, '9.0' use_frameworks! target 'CocoaPodsTestProject' do pod 'AFNetworking', '~> 2.6' end

下方就是創建Podfile文件,然后將上述的內容輸入到該文件中。
  

上面的platform指定的版本是倉庫兼容的最小版本。target則指定的是作用於工程中的那個目標。pod則用來指定相關的倉庫及倉庫版本。下方是相關倉庫版本的幾種常見的指定方式:

  • pod 'xxxx' : 后方沒有指定版本,則表示使用倉庫的最新版本。
  • pod 'xxxx', '2.3' : 使用xxxx倉庫的 2.3版本。
  • pod 'xxxx', '~>2.3': 則表示使用的版本范圍是  2.3 <= 版本 < 3.0。如果后方指定版本是 ~>2.3.1, 那么則表示使用的版本范圍是  2.3.1 <= 版本 < 2.4.0
  • pod 'xxxx', '>2.3': 使用大於2.3的版本。
  • pod 'xxxx', '>=2.3': 使用2.3及以上的版本。
  • pod 'xxxx', '<2.3': 使用小於2.3的版本。
  • pod 'xxxx', '<=2.3': 使用小於等於2.3的版本。

 

除了上述的版本指定方式,我們還可以通過指定相關代碼倉庫的路徑來指定相關的依賴,比如使用path來指定本地的相關倉庫,使用git來指定遠端的git倉庫。下方是常用的幾種方式:

  • pod 'xxx', :path => '本地代碼倉庫的路徑/xxx.podspec' #使用該方式可以指定本地存在的依賴路徑(podspec文件稍后會結介紹到)。
  • pod 'xxx', :git => 'git倉庫地址' #可以通過git倉庫地址來加載相關依賴。
  • pod 'xxx', :git => '本地代碼倉庫的路徑', :tag => '2.2.2' :#后方可以跟 :tag參數來指定相關的tag號。當然后邊還可以通過 :branch => '分支號'來指定依賴於某個分支,通過 :commit => 'commit號'來指定那個提交。

 

2、Pod Install

配置完Podfile文件,接下來就是該在相關的工程中安裝相關的依賴了。下方使用了pod install來安裝相關的依賴,使用pod update來更新相關的依賴。在安裝依賴時會提示安裝了哪些依賴的庫。因為CocoaPods在安裝后會修改我們的Xcode工程,生成一個工作空間,這個工作空間由我們的Project工程和Pods工程組成,我們所依賴的倉庫就位於這個Pods工程中,所以安裝完畢后提示要通過xxxx.xcworkspace文件來打開整個工程。pod install完畢后,我們會發現整個工程中多了一些文件,比如xxxx.xcworkspacePodsPodfile.lock等。我們就通xxxx.xcworkspace來打開相關文件,其他文件稍后會介紹到。

  

 

下方就是我們通過open CocoaPodsTestProject.xcworkspace打開的相關工程。下方的Pods中就包括相關依賴的倉庫。我們就可以在我們的工程中直接引入使用所依賴的倉庫了。上面也提到了,安裝后會生成一個工作空間workspace。該workspace就由我們原有的工程和新增的Pods工程組成。通過CocoaPods管理的依賴庫都會放在這個Pods工程中。具體如下所示:

  

 

3、鎖版文件 podfile.lock

上面簡單的提了一下podfile.lock文件。咋安裝之前我們創建了一個叫做 podfile 的依賴相關的描述文件。在pod install后會生成一個叫做podfile.lock的文件。下方截圖中是該文件中的相關內容。其中記錄了目前依賴的一些倉庫以及一些版本,該文件的目的就是鎖定依賴倉庫版本的。該 podfile.lock 本質上是用來鎖版本的,為了避免版本不一致的情況發生

我們來看一下如果沒有Podfile.lock文件,會發生什么情況。當在 podfile 中添加了相關依賴倉庫,但是沒有添加相關的依賴倉庫的版本,那么在每次 pod insall 時都會安裝該倉庫最新的版本。當一個工程有多個人開發時,A同學 在 B同學 之前進行的pod install, 而在A同學安裝后一些倉庫進行了更新,那么在 B同學 安裝倉庫時就會尋找這個最新的版本。那么這種情況下就會出現同一個工程中所依賴的倉庫版本不一致的問題。為了解決這個版本不一致的問題,於是乎就引入了Podfile.lock這個所版本用的文件。當然在框架中的包管理器中也是存在類似的lock文件的,比如 node.js 中的npm包管理器。

引入 podfile.lock 文件后,上面的版本不一致的問題就很好的解決了。在首次 pod install 后,會生成一個 podfile.lock 文件,該文件中會記錄此次 install 所安裝的版本。當再次進行 pod install時,對那些沒有指定版本的依賴倉庫會使用podfile.lock 文件中記錄的版本。如果在 podfile 中指定了相關版本,那么就直接引用 podfile 中指定的版本然后在更新 podfile.lock中記錄的版本即可。

  

 

接下來我們通過具體示例來看一下該podfile.lock文件的作用。我們將podfile中的AFNetworking的版本號給刪掉,然后再次進行pod install。此刻並不會安裝最新的AF版本,因為在podfile.lock中已經記錄下了當前使用的AF版本了,所以再次進行 pod install 時仍然會加載 podfile.lock中記錄的版本。

  

 

當然你可以使用pod update命令來進行更新,使podfile.lock中記錄的版本進行更新。當然也可以在podfile文件中指定相關依賴倉庫的版本,然后再執行pod install來更新相關的版本。具體如下所示 :

  

 

 

四、創建並發布自己的開源庫

 上面三個部分介紹了如何在自己的項目中安裝和使用CocoaPods,接下來這部分就來介紹一下如果將自己的開源的庫接入到CocoaPods中,可以讓其他人直接在Podfile中直接配置后,pod install就可以使用。下方是這一系列的操作。

1、創建自己的開源倉庫

下方以Github為例,首先我們在Github上創建了一個新的倉庫用來容納我們要開源的代碼。如下所示:

  

 

在New Repository時, 選擇創建公共倉庫,然后勾選上創建README,最后別忘了並選擇開源協議。此處我們選擇的是MIT協議,下方會對Github上支持的開源協議進行介紹。

  

 

2、主流開源協議介紹

Github中支持了主流的幾種開源協議,如:Apache、GPL、MIT、BSD、Mozilla等下方羅列了Github上支持的開源協議,具體介紹如下:

  • Apache License 2.0 :Apache Licence是著名的非盈利開源組織Apache采用的協議。簡單的說,遵循該協議標志着自己希望自己的專利能在開源免費使用的同時,保留自己在開源產品中的專利權益。同樣,該協議要求使用者必須保留你的版權信息。
  • MIT License (麻省理工學院許可證) : 一個簡短、寬松、自由的協議。該協議允許人們使用你的代碼,但必須要保留你的版權信息。與此同時,並不會給你帶來任何責任和風險。
  • BSD(Berkly Software Distribution) : 也是一個比較寬泛自由的協議,該協議允許其他人修改代碼,並進行二次發布,並且可以用於商業活動。但是要保留原有代碼的BSD協議,並且不能以原作者或者機構的名字來做市場推廣。(Unix)
    • BSD 2-Clause "Simplified" License : 簡化版本的BSD協議, 修改版本必須保持其原始版權聲明。

    •  BSD 3-Clause "New" or "Revised" License : 新的或者經過重新修訂的BSD協議, 修改版本必須保持其原始版權聲明。未經許可不得使用原作者或公司的名字做宣傳。

  • GPL (GNU General Public License - GNU通用公共許可協議) :  如果你希望別人在分享的自己的作品之后,也必須遵循相同的協議,也必須是開源和免費,那么就選擇GPL協議。也就是說只要你用了任何該協議的庫、甚至是一段代碼,那么你的整個程序,不管以何種方式鏈接,都必須全部使用GPL協議、並遵循該協議開源。商業軟件公司一般禁用GPL代碼,但可以使用GPL的可執行文件和應用程序。
    • GNU General Public License v2.0 
    • GUN General Public License v3.0 
    • GNU Affero General Public License v2.0 : Affero通用公共許可,基於GPL的擴充。即Affero GPL,是GPL的更嚴格版本。只要你用了任何該協議的庫、甚至是一段代碼,那么運行時和它相關的所有軟件、包括通過網絡聯系的所有軟件,必須全部遵循該協議開源。據律師說,它的要求范圍連硬件都包括。所以,一般公司通常禁用任何AGPL代碼。
  • LGPL : GNU Lesser General Public License - GNU寬松的通用公共許可協議,就是GPL針對動態鏈接庫放松要求了的版本,即允許非LGPL的代碼動態鏈接到LGPL的模塊。注意:不可以靜態鏈接,否則你的代碼也必須用LGPL協議開源。Mozilla Public License 2.0 : MPL - 修改版本必須保持其原始版權聲明。如果發布了編譯后的可執行文件,那么必須讓對方可以取得MPL協議下程序的源碼。
    • GNU Lesser General Public License v2.1 
    • GNU Lesser General Public License v3.0 
  • The Unlicense : 在許多國家,默認版權歸作者自動擁有,所以Unlicense協議提供了一種通用的模板,此協議表明你放棄版權,將勞動成果無私貢獻出來。你將喪失對作品的全部權利,包括在MIT/X11中定義的無擔保權利。
  • Eclipse Public License 2.0 : EPL由Eclipse基金會應用於名下的集成開發環境Eclipse上, 商業軟件可以使用,也可以修改EPL協議的代碼,但要承擔代碼產生的侵權責任。

  

 

3、如何去選擇你的開源協議

下圖是從網上拿過來的,可以根據下方的具體情況來選擇相關的開源協議。

  

 

 

4、配置podspec文件並發布自己的源代碼 

(1) 創建 podsepc文件

言歸正傳,在Github上創建好相關的工程並選好相關的開源協議后,將工程Clone到本地,添加上自己要開源的代碼,然后在該工程中創建podspec文件。可以通過 pod spec create 命令來創建相關的podsepc文件。

pod sepc create PodspecFileName 

下方是具體的操作:

  

 

然后對創建好的podspec文件進行編輯,添加上開源庫的工程名稱、版本、描述、開源協議、作者、平台、源代碼等等。具體每項的配置CocoaPods官網上有說明文檔,可以去仔細翻閱。

  

 

(2)、創建tag號並push到遠端

配置好podsepc文件后,接着創建一個tag號,這個tag好要與podspec中的version相對應。創建完tag號后,不要忘記push到遠端。tag號push到遠端后,我們可以通過 pod spec lint xxxx.podspec 來測試一下我們配置的podspec是否正確。具體操作如下所示。

  

 

(3)、測試和創建CocoaPods賬號

往CocoaPods上集成開源庫,需要相關的CocoaPods賬號。我們可以通過 pod trunk me來查看賬號是否存在。如果不存在會提示你進行注冊並且進行相關認證。下方就使用了一個為注冊過的賬號進行 trunk。然后進行了相關賬號的注冊和激活

  

 

 注冊完后,需要進入郵箱進行賬號的激活。

  

 

 再次進行trunk me測試

  

 

(4)、發布

Git倉庫配置已經賬號注冊完畢后,接下來就開始往CocoaPods上發布自己的倉庫了。我們可以通過 pod trunk push xxxxx.podspce 將podspec文件發布到CocoaPods的Spec倉庫中。完成這一操作,就完成的我們倉庫的發布了。

  

 

(5)、倉庫引用

發布完畢后我們可以通過 pod search 來進行搜索我們發布的庫。如下所示,可以正常搜到。發布完畢后我們就可以正常的在Podfile中進行配置、然后 pod install進行安裝引用了,具體引用步驟和其他三方庫一樣,在此就不做過多贅述了。

  

 

 

五、CocoaPods的Specs倉庫即源碼加載路徑

接下來我們來看一下CocoaPods的Specs倉庫,然后在Specs倉庫的基礎上在看一下CocoaPods是如何通過我們工程中所提供的Profile文件來加載三方依賴倉庫的。

1、Specs倉庫

上面在發布我們開源代碼時頁提到過,是將我們創建和配置的xxxx.podspec文件發布到 CocoaPods的Specs倉庫(https://github.com/CocoaPods/Specs.git)。Specs倉庫中就存放着各個開源庫的各個版本的podspec文件。

下方就是Github上CocoaPods的Specs倉庫。根據該倉庫的README中的信息,我們可以看出該倉庫中存儲的是所有可以用pod 導入的公有倉庫的release版本的podspec文件。這些公開的倉庫必須遵循MIT協議的。具體如下所示:

  

 

下方就是我們從CocoaPods中的Specs倉庫里邊找到的上面我們發布的測試工程。在我們工程的文件夾下對應的是一個個版本(git倉庫的tag號),每個tag號下方對應的就是該版本的podspec文件。我們在發布我們的工程到CocoaPods的時,本質上是根據我們的工程名稱創建相關的文件夾,然后根據我們的tag號創建子文件夾,然后在子文件夾中上傳當前版本所對應的podspec文件。

  

2、三方依賴的加載路徑

看完Specs倉庫里邊的內容后,接下來我們來看一下我們CocoaPods是如何通過我們工程中的Podfile文件來加載相關的三方依賴庫的。

首先我們來看一下Podfile中的基本結構。在Podfile文件中,其中的 source  參數就是用來指定依賴倉庫所對應的Specs倉庫的, source的默認地址就是CocoaPods的 Specs 倉庫。如果我們有自己的私有 Specs 倉庫,也可以指定我們自己的Specs倉庫地址。

在Podfile中可以指定多個 Specs 倉庫的地址,稍后我們會創建我們自己的Specs倉庫,然后在該Specs倉庫中上次發布我們自己使用的依賴庫。

  

 

下方是CocoaPods中加載依賴倉庫代碼的路徑,根據自己的理解,尋找源碼路徑大體上分為下方幾個步驟:

  • 通過Podfile這個 source 指定的Specs倉庫的地址,我們就可以找到相關的Specs倉庫。
  • 找到Specs倉庫后,再根據 Podfile 中所提供的倉庫依賴配置(比如 pod 'AFNetWorkiing', ~>'2.6.3'),找到指定的依賴倉庫和相關的版本。
  • 然后找到該版本所對應的 xxx.podspec 文件。
  • 然后再根據 xxx.podsepce 文件中的相關配置信息找到該倉庫所對應的源碼的git地址。
  • 最后根據源碼的git地址加載三方倉庫到Pods工程中統一管理。

下方是根據上方的步驟所畫的簡圖。CocoaPods真正的工作應該比下方要復雜的多,

  

 

 

六、創建私有的Specs倉庫

上面看完 CocoaPods 倉庫的 Specs 文件后,接下來我們來看一下如何創建私有的 Specs 倉庫。當我們的工程比較大時,尤其是使用模塊化開發是,我們的工程會依賴好多其他的倉庫。創建私有的Specs倉庫來管理私有的依賴倉庫是很有必要的。接下來就介紹一下如何創建私有的Sepcs倉庫,然后把我們私有的依賴庫發布到我們自己的Specs倉庫中。

下方以Github為例,會在Github上創建相關的Specs

1、創建私有Specs Repo

首先我們需要做的是在Github上創建一個名為Specs的倉庫(該倉庫的名字可以根據具體情況命名)。然后在本地關聯該Specs倉庫到Pod的倉庫中。

pod repo add SpecsName SpecsGitAddr

添加完畢后我們可使用 pod repo 命令來查看該倉庫是否正常添加到CocoaPods中。

  

 

我看可以用下方命令來看一下該Specs倉庫是否可用:

pod repo lint xxxxSpecsName

  

 

2、將私有依賴庫工布到自己的Specs倉庫中

經過第一步就算創建並關聯好了我們私有的Specs倉庫了,接下來我們就該將私有的依賴倉庫發布到我們自己的Specs倉庫中了。這一發布的過程與之前我們將工程發布到CocoaPods的Specs倉庫中是一致的。只不過是將CocoaPods的Specs名稱換成了上面我們配置的MyCustomSpec名稱。具體如下所示:

pod repo push XxxSpecs xxxx.podspec

  

 

發布完以后,我們可以去本地還有遠端的Specs倉庫中去查看發布的相關倉庫的信息,下方是我們本地的倉庫信息。可以看出在push完畢后,在cocoapods的repos文件夾下的MyCustomSpec文件中多了一個MyCocoaPodsTestProject 文件夾,該文件夾下存放的就是該依賴庫中的版本信息和各個版本的 podspec 文件。

  

 

我們也可以從github來查看發布的依賴庫的相關信息,如下所示。該結構與CocoaPods的Specs倉庫時差不多的。

  

3、引入私有倉庫

依賴倉庫 push 完畢后,接下來就該正常使用相關的依賴倉庫了。不過使用時在Podfile中要指定相關Podspec的地址,配置完畢后就可以pod install直接使用了。

  

 

今天博客就先到這兒吧,下篇博客會介紹另一個Cocoa包管理器Carthage。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM