一、前言
CocoaPods is the dependency manager for Swift and Objective-C Cocoa projects. It has over ten thousand libraries and can help you scale your projects elegantly.
CocoaPods is built with Ruby and is installable with the default Ruby available on OS X. We recommend you do this.
Using the default Ruby install will require you to use sudo when installing gems. Further instructions are in the guides.
CocoaPods大家都知道是用來管理第三方庫的重要工具。每種語言發展到一個階段,就會出現相應的依賴管理工具,例如 Java 語言的 Maven,nodejs 的 npm。Cocoapod的出現也是必然,方便的合并代碼,不必煩瑣地更新第三庫這些優點就不必再提了。所以我也使用了一段是時間,但是由于學習的比較瑣碎,所以就總結下,也作為自己的一份復習筆記吧。
(附上CocoaPods項目的源碼地址:https://github.com/CocoaPods/Specs
感謝這個偉大的團隊,讓我們使用上了這么好用的工具)
<另外關于cocoapods的方面,也建議瀏覽唐巧的博客里面內容很全:http://blog.devtang.com/2014/05/25/use-cocoapod-to-manage-ios-lib-dependency/>
二、幾個基本概念
- Cocoa
Cocoa是蘋果公司為Mac OS X所創建的原生面向對象的API,是Mac OS X上五大API之一(其它四個是Carbon、POSIX、X11和Java)。 - CocoaPods
CocoaPods是一個負責管理iOS項目中第三方開源庫的工具 - Ruby
CocoaPods是基于ruby ecosystem的,需要ruby環境,使用ruby的gem命令。所以我們的系統要有ruby環境。 - Gem
gem是一種文件組織的包,一般的ruby的很多插件都有由這種各種的包提供。 - 所以如果需要開發Gem的包,那么我們就有Ruby的環境,但是ruby的運行又需要gem包的支持,所以有了下文。
三、安裝CoacoaPods
首先你需要安裝ruby,幸運的是MAC系統默認會自動安裝好ruby環境。
下面介紹常用的命令
//查看ruby的版本
ruby -v
//查看當前存在的ruby版本
rvm list known
安裝對應的ruby版本(這個過程非常緩慢,請耐心等待,我MAC當前的版本是2.2.0)
rvm install 2.2.0
//查看ruby的源
gem sources -l
//查看Gem的版本
gem -v
//升級Gem版本
sudo gem update --system
OSX 10.11以前的安裝命令
// 安裝cocoapods
sudo gem install cocoapods
OSX EL Capitan的安裝命令
//安裝
sudo gem install -n /usr/local/bin cocoapods
// 安裝制定版本
sudo gem install -n /usr/local/bin cocoapods -v 1.0.0
//Beta版本
sudo gem install -n /usr/local/bin cocoapods --pre
卸載coaoapods
sudo gem uninstall cocoapods
Pod命令部分
//查看當前cocoapods的版本,可以用來檢測cocoapod是否成功,我MAC(10.12)的系統當前的版本是1.1.1
pod --version
//pod安裝成功之后一個首先的操作就是執行命令(不是必須的)
將所有第三方的Podspec索引文件更新到本地的~/.cocoapods/repos目錄下
pod setup
因為中國的防火墻的原因,我們必須更換到ruby-china的鏡像
- 移除原來的源
gem soureces --remove https://rubygems.org/
- 添加新的源,之前一直都用淘寶源 https://ruby.taobao.org/ 但是聽說已經不更新維護。建議使用ruby-china的源
gem sources -a https://gems.ruby-china.org
- 驗證是否已經替換成功
gem sources -l
- 查看并升級Gem的版本,查考以上常見命令行。我當前MAC系統升級后的Gem版本為2.6.7。
- 更新Podspec的索引文件
使用pod --version來驗證到目前為止的步驟是否是成功的。
執行pod setup
執行pod setup時,CocoaPods 會將第三方的podspec索引文件更新到本地的~/.cocoapods/repos目錄下
- 如果沒有執行過 pod setup,那用戶根目錄下~找不到.cocoapods/repos目錄的,沒有創建這個目錄。
- 如果執行 pod setup,并且命令沒有執行成功,那么會創建~/.cocoapods/repos目錄,只不過目錄是空的。
- 如果執行 pod setup,并且命令執行成功,說明把github上的Podsepc文件更新到本地,那么會創建~/.cocoapods/repos目錄,并且repos目錄里有一個master目錄,這個master目錄保存的就是github上所有第三方開源庫的Podspec索引文件。
Attention:第一次執行pod setup特別慢,請耐心等待。
四、開始使用CocoaPods
A、關于Podfile
Podfile是什么
Podfile是cocoapods安裝第三方庫的依賴文件,其中定義cocoapod需要集成的第三庫已經對應的系統要求等信息。關于 Podfile.lock
Podfile.lock 應該加入到版本控制里面,不應該把這個文件加入到.gitignore中。因為Podfile.lock會鎖定當前各依賴庫的版本,之后如果多次執行pod install不會更改版本,要pod update才會改Podfile.lock了。這樣多人協作的時候,可以防止第三方庫升級時造成大家各自的第三方庫版本不一致。
CocoaPods 的這篇 官方文檔 也在What is a Podfile.lock
一節中介紹了Podfile.lock
的作用,并且指出:
This file should always be kept under version control.
B、 Podfile的語法
- platform :ios, '7.0'
- 指定了開源庫將被編譯在哪個的平臺iOS(默認是iOS, 還有 OS X, tvOS, watchOS) 以及對應的系統版本。注意:輸入平臺請都輸入小寫字母
- inhibit_all_warnings!
屏蔽cocoapods庫里面的所有警告,這個特性也能在子target里面定義,如果你需要屏蔽某個pod里面的警告也可以是這樣
pod 'TargetName', :inhibit_warnings => true
- use_frameworks!
a. 使用frameworks動態庫替換靜態庫鏈接
b. swift項目cocoapods默認是 use_frameworks
c. OC項目cocoapods默認是 #use_frameworks <#是注釋的意思>
- workspace
指定應該包含所有projects的Xcode workspace.
如果沒有顯示指定workspace并且在Podfile所在目錄只有一個project,那么project的名稱會被用作于workspace的名稱
- projet
默認情況下是沒有指定的,當沒有指定時,會使用Podfile目錄下與target同名的工程
- target 'XXX' do
end指定特定Target的依賴庫,可以嵌套子Target的依賴庫
- inherit! :search_paths
明確指定基層與父層的所有pod,默認是繼承的
- source
指定specs的位置,自定義添加自己的podspec。公司內部使用
cocoapods 官方source是隱式的需要的,一旦你指定了其他source 你就需要也把官方的指定上
例如:
source 'ssh://git@gitlab.9ijx.com:9830/iOS/Specs.git'
source 'https://github.com/CocoaPods/Specs.git'
- 依賴庫的基本寫法
pod 'AFNetworking', '~> 3.1.0' //高于3.1.0的版本,表示使用最新版本
pod 'AFNetworking' //不指定依賴庫版本,每次都獲取最新版本
pod 'AFNetworking', '3.1.0' //只使用3.1.0的版本
pod 'AFNetworking', '>3.1.0' //使用高于3.1.0的版本
pod 'AFNetworking', '>=3.1.0' //使用大于等于
- 自定義依賴庫的路徑
Using the files from a folder local to the machine
pod 'Alamofire', :path => '~/Documents/Alamofire'
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git'
To use a different branch of the repo:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :branch => 'dev'
To use a tag of the repo:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :tag => '3.1.1'
Or specify a commit:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :commit => '0f506b1c45'
- Podfile的官方網址
C、注意事項
- 不更新 podspec
CocoaPods 在執行pod install和pod update
時,會默認先更新一次podspec索引。使用--no-repo-update
參數可以禁止其做索引更新操作。如下所示:
pod install --no-repo-update
pod update --no-repo-update
- 需要了解更多可以查閱官方文檔
https://guides.cocoapods.org/
D、常見的podfile結構
-
Simple Podfile
SimpleExample -
More complex Podfile
more complex Podfile.png
3.If you want multiple targets to share the same pods, use an abstract_target
4.There is implicit abstract target at the root of the Podfile, so you could write the above example as:
五、附錄常見問題
- You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory
這是因為你沒有使用管理員的身份運行,比如:gem update --system就需要管理員的權限,增加 sudo gem update --system就可以解決這個問題
- gem sources -l的輸出結果,默認輸出結果
輸出結果
*** CURRENT SOURCES ***
https://rubygems.org/
- pod --version出現-bash: pod: command not found
可能是你的系統OSX EL Capitan以后命令,所以你需要使用對應OSX EL Capitan,查考前面的常用的命令行。
*Performing a deep fetch of the master
specs repo to improve future performance
遇到這個問題一般是在更新系統更新之后,先更新rubu,再更新了gem,之后更新cocoapods之后出現的。 是因為pod steup的時候創建master這個庫,沒成功,之后就算移除鏡像重新安裝的話 默認是從matser庫里獲取,導致安裝不成功。出現了之后,可以在終端執行下列語句,再重新執行pod setup。
解決辦法是移除master庫,重新創建。
rm -rf ~/.cocoapods/repos/master
- pod setup 在執行時,會輸出Setting up CocoaPods master repo
,但是會等待比較久的時間。這步其實是 Cocoapods 在將它的信息下載到 ~/.cocoapods目錄下,如果你等太久,可以試著 cd 到那個目錄,用du -sh *來查看下載進度。
查看進度.png
*關于 pod setup時出現以下錯誤:
自己按照提示在終端輸入以下命令:
pod repo add master https://github.com/CocoaPods/Specs.git
在網上查到的解決辦法:在終端輸入以下命令:
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
后面的地址你可以打開Xcode顯示包內容,找到那個文件夾拖到終端里面
還有一個更具體的解決的方法,親測有效
解決方法:
cd ~/.cocoapods/repos
git clone https://github.com/CocoaPods/Specs.git master
pod install
還可以嘗試
rm -fr ~/.cocoapods/repos/master
然后再一次
pod setup
-
安裝過程出現,可以參考一下鏈接
rvm: command not found Mac
強烈建議 使用rvm安裝ruby
1、安裝 RVM
RVM:Ruby Version Manager,Ruby版本管理器,包括Ruby的版本管理和Gem庫管理(gemset)
$ curl -L get.rvm.io | bash -s stable
等待一段時間后就可以成功安裝好 RVM。
$ source ~/.bashrc
$ source ~/.bash_profile
測試是否安裝正常
rvm -v
-
系統更新到最新的系統(10.13)
使用pod命令出現以下問題
-bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad interpreter: No such file or directory
image.png
那么重新執行一遍原文中提到的步驟
出現rvm命令不執行,找不到參考以上問題
發現有新版本所以將ruby更新到2.4.png
重新安裝可以解決絕大多數問題.png
安裝完成后.png
補充部分Podfile的語法,轉自別人的簡書
source ‘URL’ : 指定鏡像倉庫的源
platform : iOS, ‘6.0’ : 指定所支持系統和最低版本
inhibit_all_warnings! :屏蔽所有warning
workspace ‘項目空間名’: 指定項目空間名
xcodeproj ‘工程文件名’:指定xcodeproj工程文件名
下面都是引入庫的語句:
pod ‘庫名’, : 引入庫,什么版本都可以(一般就是最新版本了)
pod ‘庫名’, ‘版本’ : 引入指定版本的庫,下面的運算符可以指定版本的范圍
還有> < >= <= :不解釋 ~ > : 從指定版本到倒數第二位版本號升1為止,比如 ‘~> 1.2.1’是指 1.2.1 <= 版本 < 1.3.0
pod ‘庫名’, :podspec => ‘podspec文件路徑’ : 指定導入庫的podspec文件路徑
pod ‘庫名’, :Git => ‘源碼git地址’ : 指定導入庫的源碼git地址
pod ‘庫名’, :tag => ‘tag名’ : 指定導入庫的Tag分支