CocoaPods的安裝使用和常見問題

1、什麼是CocoaPods

CocoaPods是iOS項目的依賴管理工具,該項目源碼在Github上管理。開發iOS項目不可避免地要使用第三方開源庫,CocoaPods的出現使得咱們能夠節省設置和第三方開源庫的時間。
在使用CocoaPods以前,開發項目須要用到第三方開源庫的時候,咱們須要
1.把開源庫的源代碼複製到項目中
2.添加一些依賴框架和動態庫
3.設置-ObjC,-fno-objc-arc等參數
4.管理他們的更新
在使用CocoaPods後,咱們只須要把用到的開源庫放到一個名爲Podfile的文件中,而後執行pod install.Cocoapods就會自動將這些第三方開源庫的源碼下載下來,而且爲咱們的工程設置好響應的系統依賴和編譯參數。ios

2、CocoaPods的原理

CocoaPods的原理是將全部的依賴庫都放到另外一個名爲Pods的項目中,而後讓主項目依賴Pods項目,這樣,源碼管理工做都從主項目移到了Pods項目中。Pods項目最終會編譯成一個名爲libPods.a的文件,主項目只須要依賴這個.a文件便可。git

3、CocoaPods的安裝

CocoaPods能夠方便地經過Mac自帶的RubyGems安裝。
打開Terminal,而後鍵入如下命令:
$ sudo gem install cocoapodsgithub

執行完這句若是報告如下錯誤:
ERROR: Could not find a valid gem 'cocoapods' (>= 0), here is why:
Unable to download data from https://rubygems.org/ - Errno::ETIMEDOUT: Operation timed out - connect(2) (https://rubygems.org/latest_specs.4.8.gz)
ERROR: Possible alternatives: cocoa podssql

這是由於ruby的軟件源rubygems.org由於使用亞馬遜的雲服務,被我天朝屏蔽了,須要更新一下ruby的源,過程以下:
$ gem sources -l (查看當前ruby的源)
$ gem sources --remove https://rubygems.org/
$ gem sources -a https://ruby.taobao.org/
$ gem sources -lxcode

若是gem太老,能夠嘗試用以下命令升級gem
$ sudo gem update --system
升級成功後會提示: RubyGems system software updated緩存

而後從新執行安裝下載命令
$ sudo gem install cocoapods
這時候應該沒什麼問題了(若是報告Operation not permitted...之類的錯誤,請參考第五節:常見問題5,若是報告activesupport requires Ruby version >= 2.2.2這樣的錯誤,請參考第五節:常見問題6)ruby

接下來進行安裝,執行:
$ pod setup服務器

Terminal會停留在 Setting up CocoaPods master repo 這個狀態一段時間,是由於要進行下載安裝,並且目錄比較大,須要耐心等待一下.若是想加快速度,可以使用cocoapods的鏡像索引.(文章末尾附使用鏡像索引的方法)
安裝成功後,你會看到:app


01.png
4、Cocoapods的使用

進入工程所在的目錄(工程根目錄)
執行命令 touch Podfile
這句是說新建一個名爲Podfile的文件(不能寫成別的名字,也能夠本身在工程根目錄裏面直接新建)框架

而後對改文件進行編輯,執行命令 open -e Podfile
第一次執行這個命令,會有一個空白文件打開,能夠先放在一邊,
Podfile文件的格式應該以下:
platform :ios, '7.0'
pod 'AMap2DMap', '~> 2.5.0'
pod 'AFNetworking', '~> 2.5.3'
pod 'SDWebImage', '~> 3.7.2'

須要注意的幾點:platform那一行,ios三個字母都要小寫,並且與前面的冒號之間不能有間隔,後面的版本號也能夠不寫,可是有些開源庫對版本是有要求的,好比要在6.0以上才能運行,遇到這樣的開源庫就須要寫上版本號。

platform下面就是Cocoapods須要集成的開源庫,根據你的須要肯定集成那些庫。

舉個例子:
我要集成AFNetworking這個庫類,須要在Cocoapods裏面先搜索是否有須要的庫,能夠在Terminal中輸入:
pod search AFNetworking
回車以後就能夠看到和你搜索的關鍵字相關的一些庫類,如圖:


02.png

其中第一個就是咱們須要的,把pod ‘AFNetworking’, ‘~>2.5.3’
那一行復制到咱們的Podfile文件中,保存修改。
而後在Terminal中執行 :
pod install

這樣,AFNetworking就已經下載完成而且設置好了編譯參數和依賴,之後使用的時候切記以下兩點:
1.今後之後須要使用Cocoapods生成的 .xcworkspace文件來打開工程,而不是使用之前的.xcodeproj文件
2.每次更改了Podfile文件,都須要從新執行一次pod update命令

ps:當執行pod install以後,除了Podfile,還會生成一個名爲Podfile.lock的文件,它會鎖定當前各依賴庫的版本,以後即便屢次執行pod install也不會更改版本,只有執行pod update纔會改變Podfile.lock.在多人協做的時候,這樣能夠防止第三方庫升級時候形成你們各自的第三方庫版本不一致。因此在提交版本的時候不能把它落下,也不要添加到.gitignore中.

5、常見問題

1.
[!] Invalid Podfile file: undefined local variable or method `en_US' for #<Pod::Podfile:0x00000102a5d8b0>. Updating CocoaPods might fix the issue.

緣由:單引號格式,多是手動輸入致使
解決辦法:系統偏好設置-鍵盤-文本-將「使用智能引號和破折號」一項取消勾選-再將podfile裏面的單(雙)引號修改一下

2.ArgumentError - invalid byte sequence in US-ASCII
緣由:字符集錯誤
解決辦法:
使用locale命令查看當前的字符集,若是都是zh,須要執行如下命令:
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
而後再使用locale命令查看,已經改過來了

  1. [!] The YMTea [Debug] target overrides the OTHER_LDFLAGS build setting defined in `Pods/Target Support Files/Pods/Pods.debug.xcconfig'. This can lead to problems with the CocoaPods installation
    • Use the $(inherited) flag, or
    • Remove the build settings from the target.

[!] The YMTea [Release] target overrides the OTHER_LDFLAGS build setting defined in `Pods/Target Support Files/Pods/Pods.release.xcconfig'. This can lead to problems with the CocoaPods installation

- Use the `$(inherited)` flag, or - Remove the build settings from the target.

緣由:我是在已有項目中集成Cocoapods的時候遇到這個問題,緣由是項目 Target 中作了一些設置,CocoaPods 也作了默認的設置,若是兩個設置結果不一致,就會形成問題。
解決方法:我想要使用 CocoaPods 中的設置,分別在個人項目中定義PODS_ROOTOther Linker Flags的地方(build settings),把他們的值用$(inherited)替換掉,進入終端,執行 pod update
警告沒了,回到 Xcode,build經過。
網上還流行另一種簡單粗暴的方法:點擊項目文件 project.xcodeproj,右鍵顯示包內容,用文本編輯器打開project.pbxproj,刪除OTHER_LDFLAGS的地方,保存(這種我沒試過)

4.
[!] Oh no, an error occurred.

It appears to have originated from your Podfile at line 2.

Search for existing GitHub issues similar to yours:
https://github.com/CocoaPods/CocoaPods/search?q=%2FUsers%2Fxiao6%2FMusic%2FGI06%E5%AE%9E%E8%AE%AD%E8%8A%B8%E8%8C%97%E8%8C%B6%E5%8F%B6%2FYMTea%2FPodfile%3A2%3A+syntax+error%2C+unexpected+%27%3A%27%2C+expecting+end-of-input%0Aplatform+%3A+ios%2C+%277.0%27%0A++++++++++%5E&type=Issues

If none exists, create a ticket, with the template displayed above, on:
https://github.com/CocoaPods/CocoaPods/issues/new

Be sure to first read the contributing guide for details on how to properly submit a ticket:
https://github.com/CocoaPods/CocoaPods/blob/master/CONTRIBUTING.md

Don't forget to anonymize any private data!

緣由:這個問題比較蛋疼,弄了很久,仔細看發現就是由於Podfile文件裏面 platform 那一行 冒號和ios之間多了一個空格。。。。其實這個錯誤在報錯的時候ruby已經給出了,只是一開始沒有好好看:


03.png

5.(2016.4.14更新)

若是在執行sudo gem install cocoapods的時候報如下錯誤:

ERROR: While executing gem ... (Errno::EPERM)
Operation not permitted - /usr/bin/pod

而且你的操做系統是EI Caption,但是嘗試使用如下方法來代替上面的安裝命令:

$ sudo gem install -n /usr/local/bin cocoapods

6.(2016.8.4更新)

在執行sudo gem install cocoa pods指令安裝的時候提示錯誤:

ERROR: Error installing cocoapods:
activesupport requires Ruby version >= 2.2.2.

解決方法: 因爲你的ruby版本偏低,須要升級你電腦上的ruby.
在命令行輸入:ruby -v來查看當前ruby的版本.肯定版本是低於2.2.2後就能夠開始進行ruby的升級.

通常經過rvm來升級ruby.
具體升級ruby的方法能夠參考:
http://blog.csdn.net/lissdy/article/details/9191351 這個連接中的內容(大致操做過程相同,只是要安裝的版本號的差別,你們也能夠自行查找其它資料來升級本身的ruby)

在執行rvm install 2.2.4的過程當中,我還出現了一些報錯,標題是"requirements_osx_brew_update_system ruby-2.2.4"後面有一些詳細的錯誤日誌,像下面這樣:


ruby更新錯誤.png

從日誌內容能夠看出大概意思就是說我在更新brew的過程當中出現了一些錯誤.(而後你的也可能有其餘報錯,只要根據日誌提示的錯誤內容採起相應的措施就好).因此接下來我還更新了brew:

brew update--更新homeBrew本身

我又報錯了:The /usr/local directory is not writable.以下:


homeBrew更新報錯.png


這是說,我那個路徑不可寫,按照上面說的,指令也告訴咱們了:
sudo chown -R $(whoami):admin /usr/local
輸入密碼後從新執行brew update,就出現了一系列感受要成功的進度提示等,最後提示Already up-to-date的時候,brew自己就更新好了(這個過程比較久).
接着用brew outdated命令查看brew下哪些軟件能夠進行升級.
而後brew upgrade命令用來升級因此能夠升級的軟件.
最後記得用brew cleanup來清理不須要的版本及其安裝包緩存.
截止目前,brew也被咱們更新好了.

接下來回到ruby更新,從新執行rvm install 2.2.4,又是漫長的等待後,一行行綠色的字表示ruby也安裝完成了,這時候再看看ruby的版本ruby -v:


ruby更新後版本.png

ok,升級好了.

7.(2016.8.4更新)

執行pod setup的時候,出現報錯:

Cloning into 'master'...
error: RPC failed; result=56, HTTP code = 200
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

如圖:


pod setup報錯.png

這個是用於在執行pod setup命令的時候,裏面會執行從github上面clone資源到本地的語句,可是要clone的東西太大了,超過的git限制的大小.嘗試執行如下語句把默認的限制變大:(52428000=500×1024×1024,即500M)
git config http.postBuffer 524288000
以前git中的配置是沒有這一項的,執行完以上語句後輸入git config -l能夠看到配置項的最下面多出了一行咱們剛剛配置的內容.
接下來再執行pod setup試試看吧.

附:如何使用CocoaPods的鏡像索引:
全部項目的Podspec文件都託管在https://github.com/CocoaPods/Specs, 第一次執行pod setup時,CocoaPods會將這些podspec索引文件更新到本地的~/.cocoapods目錄下, 這個索引文件比較大,因此第一次更新時很是慢. 友好人士在國內的服務器創建了Cocoapods索引庫的鏡像, 因此執行索引跟新操做時候會快不少.具體操做方法以下: $ pod repo remove master $ pod repo add master https://gitcafe.com/akuandev/Specs.git $ pod repo update 這是使用gitcafe上的鏡像,將以上代碼中的 https://gitcafe.com/akuandev/Specs.git 替換成 https://git.oschina.net/akuandev/Specs.git 便可使用oschina上的鏡像。



文/CoderAO(簡書做者) 原文連接:http://www.jianshu.com/p/6e5c0f78200a 著做權歸做者全部,轉載請聯繫做者得到受權,並標註「簡書做者」。
相關文章
相關標籤/搜索