CocoaPods 是一個負責管理 iOS 項目中第三方開源庫的工具。CocoaPods 的項目源碼在 GitHub(https://github.com/CocoaPods )上管理。git
開發 iOS 項目不可避免地要使用第三方開源庫,在使用第三方庫時,除了須要導入源碼,集成這些依賴庫還須要咱們手動去配置,還有當這些第三方庫發生了更新時,還須要手動去更新項目,這就顯得很是麻煩。github
而 CocoaPods 的出現使得咱們能夠節省設置和更新第三方開源庫的時間,經過 CocoaPods,咱們能夠將第三方的依賴庫統一管理起來,配置和更新只須要經過簡單的幾行命令便可完成。vim
在使用 CocoaPods 以前,開發項目須要用到第三方開源庫的時候,咱們須要:xcode
把開源庫的源代碼複製到項目中緩存
添加一些依賴框架和動態庫ruby
設置 -Objc,-fno-objc-arc 等參數bash
管理它們的更新app
在使用 CocoaPods 以後,咱們只須要把用到的開源庫放到一個名爲 Podfile 的文件中,而後執行 pod update 就能夠了,CocoaPods 就會自動將這些第三方開源庫的源碼下載下來,而且爲咱們的工程設置好相應的系統依賴和編譯參數。框架
CocoaPods 的原理是將全部的依賴庫都放到另外一個名爲 Pods 的項目中,而後讓主項目依賴 Pods 項目,這樣就把源碼管理工做從主項目移到了 Pods 項目中。ssh
第三方庫會被編譯成 .a 靜態庫或者 .framwork 的動態連接庫供咱們真正的工程使用。
CocoaPods 會將全部的第三方庫以 target 的方式組成一個名爲 Pods 的工程,該工程就放在剛纔新生成的 Pods 目錄下。整個第三方庫工程會生成一個名稱爲 libPods.a 的靜態庫供咱們的工程使用。
對於資源文件,CocoaPods 提供了一個名爲 Pods-resources.sh 的 bash 腳本,該腳本在項目每次編譯的時候都會執行,將第三方庫的各類資源文件複製到目標目錄中。
原來的工程設置已經被更改了,這時候咱們直接打開原來的工程文件去編譯就會報錯。咱們的工程和第三方庫所在的 Pods 工程會被以一個新生成的 workspace 的形式組織和管理,方便咱們直觀的管理工程和第三方庫。
CocoaPods 經過一個名爲 Pods.xcconfig 的文件來在編譯時設置全部的依賴和參數。
CocoaPods 是用 Ruby 寫的,並劃分紅了若干個 Gem 包。
與 CocoaPods 相關的兩個目錄:
~/.CocoaPods/repos/
:這個目錄存儲遠端的 podspec 文件到本地。master 是全部第三方的 podspec 索引文件。其它的是咱們自定義的 podspec 索引文件。
~/Library/Caches/CocoaPods/
:這個目錄就是緩存文件的存儲目錄。
CocoaPods 在解析執行過程當中最重要的幾個包的路徑分別是:CocoaPods/CocoaPods、CocoaPods/Core 和 CocoaPods/Xcodeproj。
CocoaPods/CocoaPods:這是面向用戶的組件,每當執行一個 pod 命令時,這個組件將被激活。它包括了全部實用 CocoaPods 的功能,而且還能調用其它 Gem 包來執行任務。
CocoaPods/Core:Core Gem 提供了與 CocoaPods 相關的文件(主要是 Podfile 和 Podspecs)的處理。
Podfile:該文件用於配置項目所須要的第三方庫,它能夠被高度定製。
Podspecs:該文件描述了一個庫將怎樣被添加進工程中。.podspec 文件能夠標識該第三方庫所須要的源碼文件、依賴庫、編譯選項,以及其餘第三方庫須要的配置。
CocoaPods/Xcodeproj:這個包負責處理工程文件,它能建立以及修改 .xcodeproj 文件和 .xcworkspace 文件。它也能夠做爲一個獨立的包使用,當你要編寫修改項目文件的腳本時,能夠考慮使用 CocoaPods/Xcodeproj。
CocoaPods 是基於 ruby ecosystem 的,須要 ruby 環境,使用 ruby 的 gem 命令。因此咱們的系統要有 ruby 環境。而 Mac 系統默認會安裝好 ruby 環境,能夠在終端輸入 $gem sources -l
命令查看系統 ruby 默認源爲 https://rubygems.org/
,但這個源在國內是訪問不到的,因此須要更換 ruby 鏡像。
咱們可使用淘寶的源 https://ruby.taobao.org/
,可是淘寶的源已經不更新維護了,因此不建議使用淘寶的源,咱們最好使用 ruby-china 的源 https://gems.ruby-china.org
。
移除系統 ruby 默認源
$gem sources --remove https://rubygems.org/
使用新的源
$gem sources -a https://ruby.taobao.org/
(淘寶的源,不建議使用)
或
$gem source -a https://gems.ruby-china.org
驗證是否替換成功
$gem sources -l
若是結果以下圖,代表替換成功。
選擇版本
安裝最新版本
$sudo gem install -n /usr/local/bin CocoaPods
安裝指定版本
$sudo gem install -n /usr/local/bin CocoaPods -v 1.0.0
安裝最新的 release beta 版本
$sudo gem install -n /usr/local/bin CocoaPods --pre
安裝
$pod setup
pod setup
的做用:將全部第三方的 Podspec 索引文件更新到本地的 ~/.CocoaPods/repos 目錄下。全部的第三方開源庫的 Podspec 文件都託管在 https://github.com/CocoaPods/Specs 管理,咱們須要把這個 Podspec 文件保存到本地,這樣才能使用命令 pod search
來搜索一個開源庫。
若是沒有執行過 pod setup
,用戶根目錄 ~ 下是找不到 .CocoaPods/repos 目錄的,沒有建立這個目錄。
若是執行了 pod setup
,可是命令沒有執行成功,那麼會建立 ~/.CocoaPods/repos 目錄,只不過目錄是空的。
若是執行了 pod setup
,而且命令執行成功,說明把 GitHub 上的 Podsepc 文件更新到了本地,那麼會建立 ~/.CocoaPods/repos 目錄,而且 repos 目錄裏有一個 master 目錄,這個 master 目錄保存的就是 GitHub 上全部第三方開源庫的 Podspec 索引文件。
第一次執行 pod setup
時,這個 GitHub 上的 Podspec 索引文件比較大,因此第一次更新時很是慢,要耐心等待,咱們能夠新建一個終端窗口,輸入如下命令來查看下載文件的大小。
進入文件目錄 ~/.CocoaPods
$cd ~/.CocoaPods
查看文件大小
$du -sh
驗證是否安裝成功以及是不是本身須要的版本
$pod --version
Gem 版本太低
Failed to send stats: SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: sslv3 alert handshake failure
能夠在終端輸入如下命令:
查看 Gem 的版本號
$gem -v
或者 $gem --version
升級 Gem
$sudo gem update --system
若是出現如下錯誤:
ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/update_rubygems
則輸入如下命令來升級 Gem:
$sudo gem update -n /usr/local/bin --system
Gem 介紹:
Gem 是一個管理 Ruby 庫和程序的標準包,它經過 RubyGem(如 http://rubygems.org/ )源來查找、安裝、升級和卸載軟件包,很是的便捷。若是 Gem 的版本太低就會致使 CocoaPods 安裝失敗。
全部的 Gem 包會被安裝到 /[Ruby root]/lib/ruby/gems/[ver]/
目錄下,其中包括了 cache、doc、gems、specifications 4 個目錄,cache 下放置下載的原生 Gem 包,gems 下則放置解壓過的 Gem 包。當安裝過程當中遇到問題時,能夠進入這些目錄,手動刪除有問題的 Gem 包,而後從新安裝。
一些經常使用的 Gem 命令:
查看 Gem 配置源:
$gem sources -l
Gem 添加配置源:
$gem sources -a 源的url
Gem 刪除配置源:
$gem sources -r 源的url
更新全部 Gem 包:
$gem update
更新指定的 Gem 包:
$gem update [gemname]
(注意:此命令不會升級舊版本的包)
更新 RubyGems 軟件:
$gem update --system
清除全部 Gem 包舊版本,保留最新版本:
$gem cleanup
查看 Gem 環境:
$gem environment
從 Gem 源安裝 Gem 包:
$gem install [gemname]
從本機安裝 Gem 包:
$gem install -l [gemname].gem
安裝指定版本的 Gem 包:
$gem install [gemname] --version=[版本號]
刪除指定的 Gem 包:
$gem uninstall [gemname]
(注意:此命令將刪除全部已安裝的版本)
刪除某指定版本 Gem:
$gem uninstall [gemname] --version=[版本號]
查看本機已安裝的全部 Gem 包:
$gem list --local
Ruby 版本太低
ERROR: Error installing CocoaPods: activesupport requires Ruby version >= 2.2.2
在終端輸入如下命令查看當前 Ruby 版本:
$ruby -v
Ruby 是什麼?
Ruby 是一種簡單快捷的面向對象腳本語言,主要用來實現一些自動化腳本。因爲 iOS 系統上沒有 Ruby 解釋器,因此它一般是在 Mac 系統上使用,在編譯前(絕非 app 運行時)進行一些自動化工做。CocoaPods 中的 podfile 其實就是一份 Ruby 代碼。
升級 Ruby
升級 Ruby 要首先安裝 RVM
RVM:Ruby Version Manager,Ruby 版本管理器,包括 Ruby 的版本管理和 Gem 庫管理(gemset)。
打開終端,執行如下命令:
$curl -L get.rvm.io | bash -s stable
期間須要輸入管理員密碼,而後會自動經過 Homebrew 安裝依賴包,等待一段時間後就能夠成功安裝好 RVM。
若是出現如下錯誤:
Error running 'requirements_osx_port_libs_install curl-ca-bundle automake libtool libyaml libffi libksba', showing last 15 lines of /Users/acewill/.rvm/log/1468253599_ruby-2.3.0/ package_install_curl-ca-bundle_automake_libtool_libyaml_libffi_libksba.log https://github.com/Homebrew/homebrew/wiki/Common-Issues
緣由是 Mac 上未安裝 Homebrew,須要先安裝 Homebrew。
Homebrew 是什麼?
Homebrew 是一個包管理器,用於在 Mac 上安裝一些 OS X 上沒有的 UNIX 工具。Homebrew 將這些工具通通安裝到了 /usr/local/Cellar
目錄中,並在 /usr/local/bin
中建立符號連接。
安裝 Homebrew
Homebrew 官網:http://brew.sh
從 Homebrew 官網獲取安裝命令在終端執行:
$/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
須要等待一段時間,Homebrew 安裝成功以後,從新安裝 RVM。
Homebrew 經常使用命令
搜索軟件:$brew search git
安裝軟件:$brew install git
查看軟件信息:$brew info git
更新本身:$brew update
檢查過期軟件:$brew outdated
升級能夠升級的軟件:$brew upgrade
清理不須要的軟件版本及其安裝包緩存:$brew cleanup
列出已安裝的軟件:$brew list
卸載軟件:$brew unstall git
RVM 安裝成功以後執行如下命令,載入 RVM 環境:
$source ~/.bashrc
$source ~/.bash_profile
$source ~/.profile
最後,執行如下命令測試是否安裝正常:
$rvm -v
經過 RVM 升級 Ruby
列出已知的 Ruby 版本
$rvm list known
安裝指定的 Ruby 版本
$rvm install 2.3.3
列出本地安裝的全部 Ruby 版本
$rvm list
指定系統默認的 Ruby 版本
$rvm use 2.3.3 --default
刪除指定的 Ruby 版本
$rvm remove 2.0.0
若是網速較慢的話,在執行 $rvm install 2.3.3
命令時,會花費很長的時間,並且很容易報時間超時的錯誤,解決辦法就是屢次重試,或者等網速好的時候安裝。
另外一種解決辦法就是經過 Homebrew 來升級 Ruby。
打開終端,執行如下命令:
$brew install ruby
只須要等待很短的時間就能夠升級 Ruby 成功。但經過這種方法升級 Ruby 以後,Gem 的版本可能不是最新的,咱們只須要按照上文中提到的升級 Gem 的方法來升級 Gem 便可。可是會出現如下錯誤:
ERROR: While executing gem ... (TypeError) no implicit conversion of nil into String
解決辦法:打開 Finder-->前往-->前往文件夾,輸入路徑 /usr/local/lib/ruby/2.3.0/rubygems/installer.rb
,點擊前往,找到 installer.rb 文件,打開該文件,找到文件中的如下代碼段:
if ruby_executable then question << existing
而後用如下代碼段替換找到的代碼段:
if ruby_executable then
question << (existing || 'an unknown executable')
替換以後,Gem 就能夠升級了。
GitHub 沒法連接
error: RPC failed; result=56, HTTP code = 200 fatal: The remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed
解決辦法:FQ,而後從新安裝。
CocoaPods 的分支不支持當前最新的 Xcode 版本
[!] An error occurred while performing
git pullon repo
master. [!] /usr/bin/git pull --ff-only
解決辦法:刪除 master 分支,從新創建新的分支,而後從新設置倉庫便可。在終端執行如下命令:
$sudo rm -fr ~/.CocoaPods/repos/master
經常使用 CocoaPods 命令:
$pod setup
將全部第三方的 Podspec 索引文件更新到本地的 ~/.CocoaPods/repos/
目錄下,更新本地倉庫。
$pod repo update
執行 pod repo update
更新本地倉庫,本地倉庫完成後,便可搜索到指定的第三方庫,做用相似 pod setup
。不過這個命令常常不單獨調用。好比執行 pod setup
、pod search
、pod install
、pod update
會默認執行 pod repo update
。
$pod search 開源庫
查找某一個開源庫。
$pod list
列出全部可用的第三方庫,如今已經 2.4W+ 了,還在不斷地增加。
$pod install
根據 Podfile.lock 文件中列舉的版本號來安裝第三方框架,若是一開始 Podfile.lock 文件不存在,就會按照 Podfile 文件中列舉的版本號來安裝第三方框架。
若是檢查到當前三方庫已經有的話,那就不會去下載了。
$pod install –-no-repo-update
安裝開源庫以前,不會執行 pod repo update
指令。
$pod update
將全部第三方框架更新到最新版本,而且建立一個新的 Podfile.lock 文件。
不管當前三方庫是否在項目中已經存在,都會從新下載更新。
$pod update –-no-repo-update
更新開源庫以前,不會執行 pod repo update
指令。
如下以 AFNetworking 爲例介紹 CocoaPods 的使用。
在終端搜索相應的開源類庫
$pod search AFNetworking
若是 CocoaPods 支持,將會輸出搜索到的全部類庫版本和信息,以及在 Podfile 中配置的寫法,例如:
若是提示沒有找到該開源庫,可是咱們這個第三方確實存在:
咱們可使用 pod setup
更新本地 podspec 索引文件,而後從新搜索。
若是按照 1 的方法仍是搜索不到,那咱們就把 ~/Library/Caches/CocoaPods/
目錄下的緩存文件刪除。而後 pod setup
,再從新搜索。
進入到咱們的工程目錄
$cd 咱們的工程路徑
在咱們的工程目錄下建立 Podfile 文件
經過 Mac 默認文本編輯器編寫
$touch podfile
建立 Podfile 文件
$open podfile
打開 Podfile 文件
打開 Podfile 文件以後便可編寫,編寫完成以後關閉文本編輯器便可。
使用 VIM 編輯器編寫
$vim podfile
建立 Podfile 文件並使用 VIM 編寫
執行命令以後默認是編輯模式,用鍵盤輸入 i,進入輸入模式,輸入 pod 信息,完成以後按 Esc 鍵,退出輸入模式進入編輯模式,而後再輸入 : 號,進入末行模式,在 : 號後邊輸入 wq 保存退出 Podfile 文件,回到終端,繼續進行下一步。
VIM 介紹
VIM 是一個相似於 VI 的著名的功能強大、高度可定製的文本編輯器。
VI:Visual Interface,可視化接口。
VIM:VI iMproved,VI 加強版全屏編輯器,又叫模式化編輯器。
VIM 有 3 種模式:
VIM 3 種模式間的轉換:
編輯 --> 輸入:
i:在當前光標所在字符的前面,轉換爲輸入模式輸入 --> 編輯:
Esc
編輯 --> 末行:
:
末行 --> 編輯:
Esc + ,或者按兩次 Esc
輸入模式和末行模式之間不能直接切換
使用 VIM 打開文件:
$vim 文件名 +#
打開文件,並定位於第 # 行
$vim 文件名 +:
打開文件,並定位於最後一行
使用 VIM 關閉文件:
末行模式下關閉文件
:w --> 保存
:w! --> 強行保存
:q --> 退出
:q! --> 不保存並退出
:wq --> 保存並退出
:x --> 保存並退出
編輯模式下關閉文件
ZZ --> 保存並退出
Podfile 介紹
source 'ssh://git@gitlab.9ijx.com:9830/iOS/Specs.git' source 'https://github.com/CocoaPods/Specs.git' platform :iOS, '8.0' use_frameworks! inhibit_all_warnings! workspace 'CocoaPodsTest' target 'CocoaPodsTest' do project 'CocoaPodsTest' pod 'AFNetworking' pod 'JYCarousel', '0.0.1' pod 'WCJCache', :git => "http://gitlab.9ijx.com/iOS/WCJCache.git" target :CocoaPodsTestUITests do inherit! :search_paths pod 'YYText' end end
Podfile 語法解釋:
source
指定 specs 的位置,自定義添加本身的 podspec。
platform :iOS, '8.0'
指定了開源庫應該被編譯在哪一個平臺以及平臺的最低版本。
若是不指定平臺版本,官方文檔裏寫明各平臺默認值爲 iOS:4.3,OS X:10.6,tvOS:9.0,watchOS:2.0。
use_frameworks!
使用 frameworks 動態庫替換靜態庫連接
Swift 項目 CocoaPods 默認 use_frameworks!
OC 項目 CocoaPods 默認 #use_frameworks!
inhibit_all_warnings!
屏蔽 CocoaPods 庫裏面的全部警告
這個特性也能在子 target 裏面定義,若是你想單獨屏蔽某 pod 裏面的警告也是能夠的,例如:
pod 'JYCarousel', :inhibit_warnings => true
workspace
指定包含全部 projects 的 Xcode workspace
若是沒有指定 workspace,而且在 Podfile 所在目錄下只有一個 project,那麼 project 的名稱會被用做 workspace 的名稱
target ‘xxxx’ do ... end
指定特定 target 的依賴庫
能夠嵌套子 target 的依賴庫
project
默認狀況下是沒有指定的,當沒有指定時,會使用 Podfile 目錄下與 target 同名的工程
若是指定了 project,如上例所示,則 CocoaPodsTest 這個 target 只有在 CocoaPodsTest 工程中才會連接
inherit! :search_paths
依賴庫的基本寫法
pod 'AFNetworking' --> 不顯式指定依賴庫版本,表示每次都獲取最新版本
pod 'AFNetworking', '2.0' --> 只使用 2.0 版本
pod 'AFNetworking', '> 2.0' --> 使用高於 2.0 的版本
pod 'AFNetworking', '>= 2.0' --> 使用大於或等於 2.0 的版本
pod 'AFNetworking', '< 2.0' --> 使用小於 2.0 的版本
pod 'AFNetworking', '<= 2.0' --> 使用小於或等於 2.0 的版本
pod 'AFNetworking', '~> 0.1.2' --> 使用大於等於 0.1.2 但小於 0.2 的版本
pod 'AFNetworking', '~> 0.1' --> 使用大於等於 0.1 但小於 1.0 的版本
pod 'AFNetworking', '~> 0' --> 高於 0 的版本,寫這個限制和什麼都不寫是一個效果,都表示使用最新版本
關於 Podfile.lock:
當執行 pod install
以後,CocoaPods 會生成一個名爲 Podfile.lock 的文件。
Podfile.lock 應該加入到版本控制裏面,不該該把這個文件加入到 ignores 中。由於 Podfile.lock 會鎖定當前各依賴庫的版本,以後若是屢次執行 pod install
不會更改版本,執行 pod update
時纔會更改 Podfile.lock。
這樣在多人協做的時候,能夠防止出現第三方庫升級時形成你們各自的第三方庫版本不一致。
在終端執行如下命令:
$pod update –-no-repo-update
成功以後打開工程,此時咱們應該打開最新生成的 .xcworkspace 文件,便可使用該第三方庫。
打開終端,cd 到已經配置好 CocoaPods 的項目目錄下
打開該目錄下的 Podfile 文件
刪除 Podfile 文件中要移除的第三方庫
從新執行 $pod update –-no-repo-update
命令
完成以上步驟便可移除項目中已經配置的類庫
刪除工程文件夾下的 Podfile、Podfile.lock 和 Pods 文件夾
刪除 .xcworkspace 文件
打開 xcodeproj 文件,刪除項目中的 Pods 文件夾以及 Pods.xcconfig 引用和 libpods.a 靜態庫
打開 Build Phases 選項,刪除 Check Pods Manifest.lock
、Copy Pods Resources
和 Embeded Pods Frameworks
選項
完成以上步驟便可移除項目中的 CocoaPods,項目便可編譯運行。
在終端執行如下命令:
$sudo gem uninstall CocoaPods
須要輸入密碼,以後等待很短期就會顯示卸載成功。
卸載指定版本的 CocoaPods:
$sudo gem uninstall CocoaPods -v 0.39.0