什么是cocoapods
CocoaPods是一個用來幫助我們管理第三方依賴庫的工具。它可以解決庫與庫之間的依賴關系,下載庫的源代碼,同時通過創建一個Xcode的workspace來將這些第三方庫和我們的工程連接起來,供我們開發使用。這么說可能還不是很理解,當我們開發iOS應用時,會經常使用到很多第三方開源類庫,比如JSONKit,AFNetWorking等等。可能某個類庫又用到其他類庫,所以要使用它,必須得另外下載其他類庫,而其他類庫又用到其他類庫,A依賴B,B又依賴C......。總之筆者的意思,手動一個個去下載所需類庫十分麻煩。另外一種常見情況是,你項目中用到的類庫有更新,你必須得重新下載新版本依賴庫,然后一個個重新加入到項目中,費時費力,操作繁瑣且容易出錯。如果能有什么工具能代替我們手工去解決這些依賴和更新問題,那我們開發效率將如有神助。這就是CocoaPods的作用。
總而言之,使用CocoaPods的目的是讓我們能自動化的、集中的、直觀的管理第三方開源庫。
cocoapods安裝
0.升級/安裝Ruby環境
CocoaPods 是使用 Ruby 實現的,可以通過 gem 命令來安裝。MAC 中一般自帶 Ruby 環境,如果沒有請參考 Ruby 官方文檔來安裝 Ruby 環境。也可參考 如何在Mac OS X上安裝 Ruby運行環境
- sudo gem update --system
1.查看現有Ruby鏡像源是否為taobao.org
- $gem sources -l
2.通過以上命令,如果打印的當前Ruby鏡像源是https://rubygems.org/ 那么需要使用以下命令移除然后替換為淘寶的鏡像源(如果是且僅是https://ruby.taobao.org/ 直接跳轉到第4步驟):
你或許會好奇問,為什么需要把https://rubygems.org/
替換為https://ruby.taobao.org/
,因為https://rubygems.org/
在國外,如果我們不替換為淘寶鏡像源,那么cocoapods的安裝將是非常慢,所以,強烈建議將默認的 RubyGems 源替換為淘寶的 RubyGems 鏡像,這樣速度要快很多,更多信息可以參考 RubyGems 鏡像 - 淘寶網。
- $gem sources --remove https://rubygems.org/
- $gem sources -a https://ruby.taobao.org/
3.驗證新源是否存在,注意,不是i是list的首字母l
- gem sources -l
終端顯示如下代表替換成功!
*** CURRENT SOURCES ***
http://ruby.taobao.org/
4.安裝CocoaPods
4.1. $sudo gem install cocoapods
這個命令默認安裝的應該是最新版本,如果想安裝指定版本的cocoapods,請使用以下命令:
- $sudo gem install cocoapods -v 1.0.1
備注:
如果蘋果系統升級到OS X EL Capitan(或者更高版本的macOS系統),以上命令無效,使用如下命令: - $sudo gem install -n /usr/local/bin cocoapods
- sudo xcode-select --switch /Applications/Xcode.app(可有可無)
注意: 直接運行
sudo gem install cocoapods
可能會報如下錯誤ERROR: While executing gem ... (Gem::FilePermissionError) You don't have write permissions for the /usr/bin directory. 說我們沒有管理員權限,如果你是管理員,同時也在命令前面加了sudo,不要猶豫,此時我們也需要使用
sudo gem install -n /usr/local/bin cocoapods這個命令,而非
sudo gem install cocoapods `
4.2.將 CocoaPods Specs repository復制到你電腦上~/.cocoapods目錄下
備注:
"~"代表用戶絕對目錄的收起狀態,展開為:/Users/userName,"."開頭的代表是隱藏文件
- $pod setup
執行以上命令后,需要一點時間來完成,耐心等待。如果安裝失敗那么 ~/.cocoapods 里面是空的,就需要以下兩個命令重新setup。
- pod repo remove master
- pod setup
pod setup 命令本質上是從https://github.com/CocoaPods/Specs.git
這個地址下載podspec倉庫到本地~/.cocoapods
目錄。
備注:
卸載 CocoaPods 可以使用以下命令:sudo gem uninstall cocoapods
如果執行以上卸載命令報如下錯誤:ERROR: While executing gem ... (Gem::FilePermissionError) You don't have write permissions for the /usr/bin directory.
,此時我們也是需要變更下卸載的目錄,命令如下sudo gem uninstall -n /usr/local/bin cocoapods
5.查看CocoasPods版本
- pod --version
完畢之后這個文件夾大概有 100多M,到這里你已經成功安裝了CocoaPods!
關于pod setup執行非常慢的問題
如果是第一次執行pod setup命令,你會發現進度慢的可憐,有時候等半天(真的是半天)都沒有什么反應,解決辦法請參考這篇文章。其給出的解決辦法就是通過終端執行以下兩個命令
cd ~/.cocoapods/repos
git clone https://github.com/CocoaPods/Specs.git
然后可以用pod repo
命令查看信息。也可以用pod repo update
命令更新repo.
究其原因,因為pod setup
命令的本質就是把github上CocoaPods上的Specs拷貝到repos目錄下,并改名成master。
關于通過pod search 命令找不到三方庫的問題
安裝完pod后,我們通常會通過pod search XXX命令查看某個庫是否支持pod方式集成。比如
pod search MJRefresh
然而,很不巧,終端有可能會給出下面的提示,其意為在本地repo的master中找不到匹配的庫文件MJRefresh:
但是我們明明已經下載好了master,且master內容有559.3MB,如下:
有可能你會懷疑我們master進行pod setup的時候遺漏了一部分文件或者某個環節出了問題。其實不是的,我們只需要在終端執行以下命令問題即可解決。
rm ~/Library/Caches/CocoaPods/search_index.json
無疑,此命令就是移除我們本地的search_index.json文件。該文件是根據~/.cocoapods/repos
下的master生成的與之對應的檢索文件。
然后我們在終端再次pod search XXX
命令。這個命令執行時間可能會久一點。原因在于:我們剛才移除了search_index.json文件,而pod search 命令會先查看有無search_index.json文件,如果不存在該文件,會自動根據master文件夾生成一個新的search_index.json文件,耐心等待,直到出現以下界面。
然后執行pod search XXX,我們就能search到匹配的庫文件(當然前提是我們search的三方庫支持pod)
如果你查看~/Library/Caches/CocoaPods/
目錄,發現系統自動給我們生成了search_index.json
文件。
關于pod search XXX 找不到第三方庫的問題,這篇文章也有介紹。
cocoapods使用
1.使用search命令搜索類庫名,如果能搜到,那么代表該依賴庫支持pods的方式集成,反之不能。
- $ pod search AFNetworking
2.創建Podfile文件,最好把Podfile創建在項目根目錄下(也就是和我們項目的XXX.xcodeproj文件同目錄)
$vim Podfile
3.在 Podfile中添加我們需要依賴的庫名和版本號,如下
platform :ios, '8.0'
# Uncomment this line if you're using Swift
use_frameworks!
pod 'AFNetworking', '~> 3.0'
注意:你是否還在使用touch 命令創建podfile文件?你是否還在手動配置podfile文件中的target。從今以后,你可以使用cd命令切換到工程根目錄下,然后使用pod init 方法在當前目錄下快捷的創建一個podfile文件,并且podfile文件已經根據當前目錄中的工程名稱進行了配置。如下圖:
PS:上面說過,最好把podfile文件放在工程根目錄下,其實Podfile文件也可以不放在工程的根目錄下。如果podfile文件放在非根目錄下,需要做的是在Podfile中指定后綴名為
.xcodeproj
的文件的路徑。因為默認情況下,podfile文件是要和.xcodeproj
文件處于同一個目錄下的,正因為.xcodeproj
文件處于項目的根目錄下,所以我們經常把podfile放在根目錄下,這才是建議大家把podfile放在根目錄的原因。如果非要把podfile文件放在非根目錄下。我們就需要在Podfile文件頭部指定.xcodeproj
文件的路徑,如下圖:
然后執行pod install --verbose --no-repo-update 命令,AFNetworking就安裝得到項目中了,如下圖:
和Pod file在根目錄下時不同,當Podfle不在根目錄下時候,Pods文件夾、Podfile.lock、.xcworkspace
都不在根目錄下。也就是說,Pods文件夾、Podfile.lock、.xcworkspace
到底在哪個目錄下,取決于Podfile在哪個目錄,即,Pods文件夾、Podfile.lock、.xcworkspace
永遠和Podfile同目錄。
2.使用install命令安裝依賴庫
pod --verbose --no-repo-update
執行命令后,控制臺會打印如下信息,分別分析依賴、下載依賴、安裝依賴庫AFNetworking、生成Pods工程、集成我們的項目和Pods工程(也就是生成名為XXX.xcworkspace的文件)。最后會在終端提醒,從現在起,我們該用后綴名為.xcworkspace的文件打開項目。
EricmatoMacBook-Pro:CocoaPodsDemo ericwang$ pod install
Analyzing dependencies
Downloading dependencies
Installing AFNetworking (3.0)
Generating Pods project
Integrating client project
[!] From now on use `VVSPodsDemo.xcworkspace`.
以上是用命令行的方式創建Podfile、編輯Podfile、安裝依賴庫。還有一種更方便的方式,就是使用CocoaPods插件。CocoaPods的安裝和使用非常簡單,和其他插件的安裝一樣,此處不再贅述。
CocoaPods常見問題
Podfile文件過期
問題摘自CocoaPods安裝和使用教程
[!] Required version (UAAppReviewManager (from `../`)) not found for `UAAppReviewManager`.
Available versions: 0.1.6
這里的意思大概是Podfile文件過期,類庫有升級,但是Podfile沒有更改。 pod update會更新所有的類庫,獲取最新版本的類庫。而且你會發現,如果用了
pod install 就成功了。
那你也許會問,什么時候用 pod update 呢,我又不知道類庫有沒有新版本。好吧,那你每次直接用
pod install,如果不行,再用 $ pod update。但是如果我們在團隊開發中,clone公司的項目到本地,此時我們應該直接用pod install,不建議用pod update (為了保持依賴庫版本同步)。詳情如下:
pod install :優先按照podfile.lock 中的依賴庫信息更新pod依賴庫。如果沒有podfile.lock,再按照podfile中的依賴庫信息更新pod依賴庫。
pod update 直接按照podfile中的依賴庫信息更新pod依賴庫。
本地pod repo長時間未更新導致找不到最新版本的依賴庫
如下圖,從github上下載了一個別人的demo,執行pod install 命令后報一下錯誤:
原因在于我本地的pod倉庫已經很久沒有更新,本地并沒有3.8.1版本的SDWebImage依賴庫的說明文件(podSpec文件)。此時需要執行pod repo update命令過來更新本地的依賴庫。如下圖:
耐心等待...然后本地倉庫更新完成,如下圖:
最后執行pod search SEWebImage命令查看版本信息,發現已經有3.8.1這個版本了,如下圖:
最后執行pod install 命令,pod 依賴庫便可以成功安裝,如下圖:
找不到頭文件
cocoapods導入一個第三方的庫(開源庫或者靜態/動態庫),然后導入這個庫的頭文件,編譯報錯,說某個頭文件找不到。錯誤如下:
解決方案:
配置頭文件的搜索路徑,配置如下:
問題描述:使用cocoapods時,import某個頭文件后, 找不到這個頭文件中import的其他頭文件。
問題原因:這是因為還沒設置頭文件的目錄。
解決辦法:在項目的Target的里設置一下,添加cocoapods頭文件目錄:目錄路徑直接寫:${SRCROOT} ,后邊選擇recursive 。就可以了。
注意:必須選擇recursive ,否則照樣報錯,recursive是遞歸查找的意思,如果在當前路徑下找不到頭文件,會去子路徑下繼續查找。
注意:是在 User Header Search Paths 里添加,不是上面的 Header Search Paths.
如圖:
文/VV木公子(簡書作者)
PS:如非特別說明,所有文章均為原創作品,著作權歸作者所有,轉載轉載請聯系作者獲得授權,并注明出處,所有打賞均歸本人所有!
如果您是iOS開發者,或者對本篇文章感興趣,請關注本人,后續會更新更多相關文章!敬請期待!
參考文章
CocoaPods安裝和使用教程
CocoaPods安裝和使用教程以及一些常見問題
2016 cocoapods的安裝和使用以及版本升級遇到的問題