iOS的庫依賴管理工具CocoaPods

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

工欲善其事,必先利其器!在iOS開發中 CocoaPods 作為庫依賴管理工具就是一把利器。

有了CocoaPods你再也不需要手動將需要的第三方庫拖進你的工程、添加第三方庫所依賴的framework、設置如-fno-objc-arc等編譯參數、手動管理這些庫的更新,當某個第三方庫有依賴其他的庫還要繼續拖、拖、拖......

我們只需要將所需要的第三方庫聲明到一個名為Podfile文件中,然后執行Pod install命令就OK了,CocoaPods就會自動去下載我們所需要庫,并為我的工程設置好相應的系統依賴和編譯參數。

只能說,好用到哭~

安裝CocoaPods

CocoaPods依賴于Ruby環境,剛好Mac下自帶Ruby,使用Ruby的gem命令即可安裝CocoaPods。
為防止因gem太老而引發問題,建議執行如下命令先更新gem:

$ sudo gem update --system

執行如下命令安裝CocoaPods:

$ sudo gem install cocoapods

如果執行上述命令后沒有反應,那是因為Ruby的軟件源 https://rubygems.org 使用的是亞馬遜的云服務而被墻了(GFW的偉大。。。)
可以用淘寶的Ruby鏡像來訪問cocoapods,依次執行如下命令將官方的Ruby源替換成國內淘寶的源

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

執行如下命令驗證Ruby鏡像的確是taobao的:

# $ gem sources -l

出現如下文字才說明上面的命令是執行成功的:

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

此時,再次執行gem命令安裝CocoaPods:

$ sudo gem install cocoapods
$ pod setup

稍等片刻 即可安裝成功。

注: pod setup 是Cocoapods將它的信息下載到 ~/.cocoapods/repos 目錄下。即使在安裝時不執行此命令,在初次執行 pod install 命令時,系統也會自動執行 pod setup

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

ruby.taobao.org 停止更新了,使用 cocoapods 的同學,請更新到 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更新 以上------------------------------------------------

升級CocoaPods

升級CocoaPods非常簡單,使用Ruby的gem命令:

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

當然執行如下命令也可以更新:

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

注:OS X 10.11之后升級CocoaPods會有問題。解決方案參見下一篇博客:解決OS X 10.11之后CocoaPods的升級問題

降級CocoaPods

有時我們需要降低CocoaPods版本來解決某些第三方庫的兼容問題,例如RestKit不兼容CocoaPods的0.39.0版本,降級到0.38.2就OK了。

移除RubyGems中的Cocoapods程序包

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

$ 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,執行如下命令:

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

成功刪除則輸出:

Successfully uninstalled cocoapods-1.0.0.beta.4

還有一個0.39.0版本,移除程序包,執行如下命令:

$ sudo gem uninstall cocoapods -v 0.39.0

當移除最后一個版本時,詢問:

Remove executables:
  pod, sandbox-pod

  in addition to the gem? [Yn]

按下回車鍵刪除pod。查看CocoaPods組件的安裝目錄,執行命令$ which pod所得目錄下的pod文件隨即刪除。

安裝指定版本的Cocoapods程序包

安裝指定版本的CocoaPods 如0.39.0,執行如下命令:

$ sudo gem install cocoapods -v 0.39.0

注:若不指定版本,即命令如sudo gem install cocoapods則默認安裝最新版。

安裝成功后,執行命令查看版本號:

$ pod --version

輸出:

0.39.0

使用CocoaPods

搜索第三方庫

為判斷某第三方庫(如AFNetworking)是否支持CocoaPods,執行如下命令來搜索:

$ pod search AFNetworking

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


searchAFNetworking

創建Podfile的文件

CocoaPods就可以根據Podfile文件里的內容來幫你下載你所需要的庫。點擊前往CocoaPods官方對Podfile文件的介紹。
終端cd到你的項目所在目錄下,創建Podfile文件:

$ vim Podfile

按下i鍵進入輸入狀態,在Podfile文件里輸入以下文字:

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

按下esc鍵退出輸入。然后保存退出,命令是:wq。你當然可以使用vim之外的編輯軟件來編輯Podfile文件。

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

當然,采用創建Podfile文件的另一種方式,終端cd到你的項目所在目錄下執行命令 pod init 會自動生成格式,自己試一下你會喜歡的~

終端cd到你的項目所在目錄下執行如下命令來利用CocoPods下載第三方庫:

$ pod install

如下圖所示則下載成功:

pod install

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

打開Your_App_Name.xcworkspace 工程之后會看到 Pods 文件,AFNetwoking已經成功導入項目了。

你或許應當點擊前往CocoaPods官網查看對pod install vs. pod update的介紹。

注:當你 clone 別人的項目到本地后也需要終端cd到項目所在目錄下執行命令 $ pod install

關于Podfile.lock的文件

執行pod install之后,CocoaPods會生成一個名為Podfile.lock的文件。并鎖定當前各依賴庫的版本,之后如果多次執行pod install或者團隊中的其它人check下來這份包含Podfile.lock文件的工程后再執行pod install命令時,獲取下來的Pods依賴庫的版本就和最開始用戶獲取到的版本一致。如果沒有Podfile.lock文件,執行pod install命令會獲取第三方庫的最新版本,這就有可能造成同一個團隊使用的依賴庫版本不一致,這對團隊協作的危害無疑是災難性的!
在這種情況下,如果團隊想使用當前最新版本的依賴庫,有兩種方案可修改Podfile.lock的紀錄:

  • 更改Podfile中各依賴庫的版本
  • 執行pod update命令

鑒于Podfile.lock文件對團隊協作如此重要,我們應該將它添加到版本控制里。

點擊前往CocoaPods官網查看對Podfile.lock的介紹。

補充:有時執行pod update命令會特別慢,可以嘗試使用如下命令:
$ pod update --verbose --no-repo-update
pod install命令同理:
$ pod install --verbose --no-repo-update

發布自己的開源框架到CocoaPods

你需要如下圖創建一個Framework來打造你自己的開源框架


Framework

在工程目錄下添加一份開源協議文件,一般為“LICENSE”,在 github 上新建倉庫時可以同時新建 README.md 文件及 LICENSE 文件。

在開始之前你應當使用郵箱賬號注冊 CocoaPods

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

隨后會收到一份驗證郵件,點擊鏈接進行驗證,之后通過以下命令查看注冊結果:

$ pod trunk me

結果應為:

  - 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

加下來就是正式開始推送自己的框架到 CocoaPods,
發布自己的開源框架到CocoaPods同樣需要一個類似Podfile的文件來告訴CocoaPods我們開源庫的名稱、版本、作者、描述、地址、所需的framework、依賴庫等,這個文件叫my_framework_name.podspec,開始創建這個文件

終端cd到工程目錄下,執行如下命令:

$ pod spec create my_framework_name

這樣在你的工程目錄下會生成一個my_framework_name.podspec文件,大概內容為(將對應名稱修改為你自己的):

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

然后執行如下命令

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

檢查 podspec 語法和項目是否正常編譯,執行如下命令:

$ pod spec lint my_framework_name.podspec

確保沒有任何 error 和 warning ,然后推送 podspec 到 CocoaPods 的主倉庫就可以了

$ pod trunk push my_framework_name.podspec    // 提交到 CocoaPods 中心倉庫

成功后結果應該為:

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 搜索一下吧~
如果搜不到的話,建議執行如下方法:

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

后記

參考鏈接

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

推薦閱讀更多精彩內容