標籤:
(本文是自己通過其他文章進行的自我編輯和簡單修改,請大家湊活看看)
一、什麼是CocoaPods
CocoaPods是iOS項目的依賴管理工具,該項目源碼在Github上管理。開發iOS項目不可避免地要使用第三方開源庫,CocoaPods的出現使得我們可以節省設定和第三方開源庫的時間。
在使用CocoaPods之前,開發項目需要用到第三方開源庫的時候,我們需要
1.把開源庫的原始碼複製到項目中
2.添加一些依賴架構和動態庫
3.設定-ObjC,-fno-objc-arc等參數
4.管理他們的更新
在使用CocoaPods後,我們只需要把用到的開源庫放到一個名為Podfile的檔案中,然後執行pod install.Cocoapods就會自動將這些第三方開源庫的源碼下載下來,並且為我們的工程設定好響應的系統依賴和編譯參數。
二、CocoaPods的原理
CocoaPods的原理是將所有的依賴庫都放到另一個名為Pods的項目中,然後讓主專案依賴Pods項目,這樣,源碼管理工作都從主專案移到了Pods項目中。Pods項目最終會編譯成一個名為libPods.a的檔案,主專案只需要依賴這個.a檔案即可。
三、CocoaPods的安裝
CocoaPods可以方便地通過Mac內建的RubyGems安裝。
開啟Terminal,然後鍵入以下命令:
$ sudo gem install cocoapods
執行完這句如果報告以下錯誤:
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 pods
這是因為ruby的軟體源rubygems.org因為使用亞馬遜的雲端服務,被我天朝屏蔽了,需要更新一下ruby的源,過程如下:
$ gem sources -l (查看當前ruby的源)
$ gem sources --remove https://rubygems.org/
$ gem sources -a https://ruby.taobao.org/
$ gem sources -l
如果gem太老,可以嘗試用如下命令升級gem
$ sudo gem update --system
升級成功後會提示: RubyGems system software updated
然後重新執行安裝下載命令
$ sudo gem install cocoapods
這時候應該沒什麼問題了(如果報告Operation not permitted...之類的錯誤,請參考第五節:常見問題)
接下來進行安裝,執行:
$ pod setup
Terminal會停留在 Setting up CocoaPods master repo 這個狀態一段時間,是因為要進行下載安裝,而且目錄比較大,需要耐心等待一下.如果想加快速度,可使用cocoapods的鏡像索引.(文章末尾附使用鏡像索引的方法)
安裝成功後,你會看到:
01.png四、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中.
五、常見問題
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命令查看,已經改過來了
- [!] The
YMTea [Debug] target overrides theOTHER_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 theOTHER_LDFLAGS build setting defined in `Pods/Target Support Files/Pods/Pods.release.xcconfig‘. This can lead to problems with the CocoaPods installation
3.- Use the `$(inherited)` flag, or- Remove the build settings from the target.
原因:我是在已有項目中整合Cocoapods的時候遇到這個問題,原因是項目 Target 中做了一些設定,CocoaPods 也做了預設的設定,如果兩個設定結果不一致,就會造成問題。
解決方案:我想要使用 CocoaPods 中的設定,分別在我的項目中定義PODS_ROOT 和 Other 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.png5.(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 cocoa pods
6.
當遇到這個問題時:
[plain] view plain copy print?
- Could not automatically select an Xcode project. Specify one in your Podfile like so:
-
- xcodeproj ‘path/to/Project.xcodeproj‘
在Podfile檔案裡指定下工程目錄就行了,比如我在Podfile檔案添加這行就行了:
[plain] view plain copy print?
- ......
- xcodeproj ‘Portfolio/Portfolio.xcodeproj‘
- ......
主要是讓Pod找到子目錄中的工程檔案。
附:如何使用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 替換成 http://git.oschina.net/akuandev/Specs.git 即可使用oschina上的鏡像。
對於CocoaPods的簡單理解,實踐安裝使用過程和常見問題