一. CocoaPods的介紹
什么是CocoaPods?CocoaPods是一個負責管理iOS項目中第三方開源庫的工具,CocoaPods的項目源碼在https://github.com/CocoaPods/Specs上管理。
經過CocoaPods團隊的不懈努力,2016年5月10號,CocoaPods終于在其官方博客上宣布正式發布CocoaPods 1.0。與此同時,公開了相應的Mac版App——CocoaPods App 1.0 。
CocoaPods App 1.0 的下載地址:https://cocoapods.org/app
二. CocoaPods的安裝
1. 替換ruby源
CocoaPods是基于ruby ecosystem的,需要ruby環境,使用ruby的gem命令。所以我們的系統要有ruby環境。然而Mac系統默認會安裝好ruby環境。可在終端ruby -v查看ruby版本:
//查看ruby版本
ruby -v
//輸出信息
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15]
查看ruby源
gem sources -l
默認情況下,終端會顯示下面:
*** CURRENT SOURCES ***
https://rubygems.org/
當然這個源在墻內是訪問不到的,所以要更換到ruby-china的鏡像
// 1.移除掉原有的源
gem sources --remove https://rubygems.org/
//2.淘寶的源已經不更新維護了,現在使用ruby-china的源哦
gem source -a https://gems.ruby-china.org
以下命令添加淘寶的源:(不建議繼續使用)
gem sources -a https://ruby.taobao.org/
// 3.驗證是否替換成功
gem sources -l
如果顯示下面輸出就說明正確:
*** CURRENT SOURCES ***
https://gems.ruby-china.org
2. 更新升級 Gem 版本
Gem是管理Ruby庫和程序的標準包,如果它的版本過低也可能導致安裝失敗,解決方案自然是升級Gem,執行下述命令即可:
// 更新升級gem,國內需要切換源
sudo gem update --system
查看gem版本
gem -v
2.6.6
3. 安裝CocoaPods
OS X 10.11 以前安裝命令為:
sudo gem install cocoapods// 安裝cocoapods
Mac系統為OS X EL Capitan安裝命令為:
//安裝最新版本
sudo gem install -n /usr/local/bin cocoa pods
//安裝指定版本
sudo gem install -n /usr/local/bin cocoapods -v 1.0.0
//安裝最新的release beta版本
sudo gem install -n /usr/local/bin cocoapods --pre
如果你想卸載CocoaPods怎么辦?看下面:
//卸載CocoaPods
sudo gem uninstall cocoapods
4. 更新Podspec索引文件
如果按照上面3個步驟沒問題,用命令pod --version查看是否安裝成功,如果成功會顯示pod的版本。
pod setup作用:將所有第三方的Podspec索引文件更新到本地的~/.cocoapods/repos目錄下
pod安裝成功之后一個首先的操作就是執行命令(不是必須的):
pod setup
所有的第三方開源庫的Podspec文件都托管在https://github.com/CocoaPods/Specs
我們需要把這個Podspec文件保存到本地,這樣才能讓我們使用命令pod search 開源庫搜索一個開源庫,怎樣才能把github上的Podspec文件保存本地呢?那就是 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索引文件。
但是第一次執行pod setup時,這個github的Podspec索引文件比較大,有 300M 左右(以后會越來越大的),所以第一次更新時非常慢.要耐心等待......可以進去目錄~/.cocoapods/repos使用命令du -sh *來查看下載文件的大小了
怎么才能快點呢?網上好多給出都是更換索引庫的鏡像,gitcafe
和oschina, gitcafe已經被coding收購了(2016年3月份左右收購)。這兩個我親測,現在都不行了(可能是我網速不好,基本上就是連接失敗,有空網速好點的時候我在測試一下)。所以還是別更換 CocoaPods 索引庫的鏡像了。
三. CocoaPods的使用
1. 新建 Podfile文件
使用時需要在你的項目根目錄下新建一個名為Podfile的文件(文件名一定為Podfile,不能更改),將依賴的庫名字依次列在文件中即可.
//進入項目的根目錄
cd ~/Desktop/Projects/JYCocoaPodsTest
//新建一個名為Podfile的文件
touch Podfile
2. 編輯 Podfile文件
CococaPods升級到1.0.0版本之后,Podfile文件的格式也發生了很大改變
我來帶領大家寫一個完整的Podfile文件 ,各個選項的解釋在文件后面一起解釋。
假設我們的項目名稱為JYCocoaPodsTest, 為JYCocoaPodsTest新建了一個UITarget。打開JYCocoaPodsTest.xcodeproj結構如下:
JYCocoaPodsTest.xcodeproj結構.png
1. 簡單的Podfile:
platform :ios, '7.0'
inhibit_all_warnings!
xcodeproj 'JYCocoaPodsTest'
workspace 'JYCocoaPodsTest'
use_frameworks!
target 'JYCocoaPodsTest' do
pod 'AFNetworking',
pod 'JYCarousel', '0.0.1'
end
2. 稍微復雜的Podfile:
source 'ssh://git@gitlab.9ijx.com:9830/iOS/Specs.git'
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '7.0'
use_frameworks!
inhibit_all_warnings!
workspace 'JYCocoaPodsTest'
target 'JYCocoaPodsTest' do
pod 'AFNetworking'
pod 'JYCarousel', '0.0.1'
pod 'WCJCache', :git => "http://gitlab.9ijx.com/iOS/WCJCache.git"
target :JYCocoaPodsTestUITests do
inherit! :search_paths
pod 'YYText'
end
end
3. Podfile的語法解釋:
1. platform :iOS, '7.0'
指定了開源庫應該被編譯在哪個平臺以及平臺的最低版本。
若不指定平臺版本,官方文檔里寫明各平臺默認值為iOS:4.3,OS X:10.6,tvOS:9.0,watchOS:2.0
2. inhibit_all_warnings!
屏蔽cocoapods庫里面的所有警告
這個特性也能在子target里面定義,如果你想屏蔽某pod里面的警告也是可以的:
pod 'JYCarousel', :inhibit_warnings => true
3. xcodeproj,現在被project代替,這個變量就別使用了
允許你指定需要鏈接的工程
4. use_frameworks!
使用frameworks動態庫替換靜態庫鏈接
(1)swift項目cocoapods 默認 use_frameworks!
(2)OC項目cocoapods 默認 #use_frameworks!
5. workspace
指定應該包含所有projects的Xcode workspace.
如果沒有顯示指定workspace并且在Podfile所在目錄只有一個project,那么project的名稱會被用作于workspace的名稱
6. project
默認情況下是沒有指定的,當沒有指定時,會使用Podfile目錄下與target同名的工程:(我們只有一個工程JYCocoaPodsTest)
# JYCocoaPodsTest這個Target只有在JYCocoaPodsTest工程中才會鏈接
target 'JYCocoaPodsTest' do
project 'JYCocoaPodsTest'
...
end
5. target 'xxxx' do
end
指定特定Target的依賴庫
可以嵌套子Target的依賴庫
6. inherit! :search_paths
明確指定繼承于父層的所有pod,默認就是繼承的
7. source
指定specs的位置,自定義添加自己的podspec。公司內部使用
cocoapods 官方source是隱式的需要的,一旦你指定了其他source 你就需要也把官方的指定上
例如:
source 'ssh://git@gitlab.9ijx.com:9830/iOS/Specs.git'
source 'https://github.com/CocoaPods/Specs.git'
當我們使用pod install或者pod setup時,會自動在~/.cocoapods/repo目錄下更新項目需要的podspec索引文件如下:
本地podspec索引文件.png
4. 依賴庫的基本寫法:
pod 'JYCarousel', //不顯式指定依賴庫版本,表示每次都獲取最新版本
pod 'JYCarousel', '0.01'//只使用0.0.1版本
pod 'JYCarousel', '>0.0.1' //使用高于0.0.1的版本
pod 'JYCarousel', '>=0.0.1' //使用大于或等于0.0.1的版本
pod 'JYCarousel', '<0.0.2' //使用小于0.0.2的版本
pod 'JYCarousel', '<=0.0.2' //使用小于或等于0.0.2的版本
pod 'JYCarousel', '~>0.0.1' //使用大于等于0.0.1但小于0.1的版本,相當于>=0.0.1&&<0.1
pod 'JYCarousel', '~>0.1' //使用大于等于0.1但小于1.0的版本
pod 'JYCarousel', '~>0' //高于0的版本,寫這個限制和什么都不寫是一個效果,都表示使用最新版本
5. 依賴庫的自定義寫法
下面都會用到podspec文件,所以要熟悉這個文件的構成才可以.
我會在下一篇博客編輯這個文件
Using the files from a local path (使用本地文件)
pod 'JYCarousel', :path => '/Users/Dely/Desktop/JYCarousel'
我新建一個工程PodTest來演示
1.在podfile寫好依賴路徑
platform :ios, '7.0'
inhibit_all_warnings!
workspace 'PodTest'
target 'PodTest' do
pod 'JYCarousel', :path => '/Users/Dely/Desktop/JYCarousel'
end
2.在你的本地pod庫添加xxx.podspec文件,(一定要注意是根目錄添加)
JYCarousel目錄結構.png
)
3.編輯xxx.podspec文件
主要下面紅框點,修改成你的本地路徑:
podspec.png
4.進入項目根目錄進行安裝pod install
PodTest.xcworkspace.png
From a podspec in the root of a library repository (引用倉庫根目錄的podspec)
在倉庫根目錄下加入podsepc文件上傳到git上就可以了(比較簡單)
使用倉庫中的master分支:
pod 'JYCarousel', :git => 'https://github.com/Delyer/JYCarousel.git'
使用倉庫的其他分支:
pod 'JYCarousel', :git => 'https://github.com/Delyer/JYCarousel.git' :branch => 'release'
使用倉庫的某個tag:
pod 'JYCarousel', :git => 'https://github.com/Delyer/JYCarousel.git', :tag => '0.0.1'
或者指定一個提交記錄:
pod 'JYCarousel', :git => 'https://github.com/Delyer/JYCarousel.git', :commit => '5e473f1e0530bb3799f2f0d70554b292570bd8f0'
需要特別注意的是,雖然這樣將會滿足任何在Pod中的依賴項通過其他Pods
但是 podspec必須存在于倉庫的根目錄 中,如果根目錄中沒有存在這個podspec文件,你將不得不使用下面提到的幾種方式之一
From a podspec outside a spec repository, for a library without podspec(在一個不帶podsepec的庫里引用外部的spec)
如果一個podspec能夠從外部的倉庫源的獲取,設想一下,也通過HTTP來獲取podspec:
pod 'JSONKit', :podspec => 'https://example.com/JSONKit.podspec'
pod spec
使用一個在給定podspec中聲明的Pod的依賴項。如果如果沒有參數被傳遞,那么在Podfile根部的第一個podspec會被使用。它將會被庫所在的工程所使用
注意:這個不會包含哪些來自于podspec的資源而僅僅是來自于CocoaPods基礎架構
例子:
podspec
podspec :name => 'QuickDialog'
podspec :path => '/Documents/PrettyKit/PrettyKit.podspec'
上面的基本夠我們日常使用。如果你還想了解更多。請到CocoaPods官方博客學習:https://guides.cocoapods.org
3. 安裝依賴開源庫
第二步中我們編輯好的Podfile文件保存好,進入項目根目錄執行命令
//進入項目的根目錄
cd ~/Desktop/Projects/JYCocoaPodsTest
//安裝依賴庫
pod install
pod install.png
pod install命令執行成功后,會看到項目根目錄下多出xxx.xcworkspace、Podfile.lock文件和Pods目錄。再看看剛才執行完pod install命令打印出來的內容的最后一行:From now on use CocoaPodsDemo.xcworkspace.提示我們從現在起,我們需要使用JYCocoaPodsTest.xcworkspace文件來開發。
4. 第三方庫更新
跟pod install相似的一個命令就是pod update.
如果未指定特定版本的話,pod update將所有第三方框架更新到最新版本。
5. pod文件和命令說明
-----------------------------新增文件------------------------------
1. Podfile文件
項目的第三方庫的依賴以及項目的基本配置
2. Podfile.lock文件
最后一次更新Pods時, 保存所有第三方框架的版本號
3. pods目錄
保存通過pod install或者pod update下載下來的第三方開源庫的源代碼
4. xxx.xcworkspace文件
重新生成一個工作空間,打開這個工程文件來進行開發
-----------------------------常用指令------------------------------
1. pod setup
將所有第三方的Podspec索引文件更新到本地的~/.cocoapods/repos目錄下,更新本地倉庫。
2. pod repo update
執行 pod repo update更新本地倉庫,本地倉庫完成后,即可搜索到指定的第三方庫,作用類似pod setup。不過這個命令經常不單獨調用。比如執行pod setup、pod search、pod install、pod update會默認執行pod repo update
3. pod search xxx
查找某一個開源庫。查找開源庫之前,默認會執行pod repo update指令
4. pod list
列出所有可用的第三方庫.現在已經2.4W+了.還在不斷地增長
5. pod install
會根據Podfile.lock文件中列舉的版本號來安裝第三方框架
如果一開始Podfile.lock文件不存在, 就會按照Podfile文件列舉的版本號來安裝第三方框架
安裝開源庫之前, 默認會執行pod repo update指令
6. pod update
將所有第三方框架更新到最新版本, 并且創建一個新的Podfile.lock文件
安裝開源庫之前, 默認會執行pod repo update指令
7. pod install --no-repo-update
8. pod update --no-repo-update
安裝開源庫之前, 不會執行pod repo update指令
四. CocoaPods相關的兩個目錄
目錄~/.cocoapods/repos/這個目錄存儲遠端的podspec文件到本地。master是所有第三方的pod spec索引文件。其他的使我們自定義的podspec索引文件。
~/.cocoapods/repos/目錄.png
目錄~/Library/Caches/CocoaPods/這個目錄就是緩存文件的存儲目錄。
~/Library/Caches/CocoaPods/目錄.png
如果我們使用pod search xxx 提示沒有找到,但是我們這個第三方確實存在。
1.我們可以使用pod setup更新本地pod spec索引文件。然后pod search xxx
2.按照1的方法如果還是pod search xxx找不到,那我們就把~/Library/Caches/CocoaPods/的緩存文件刪除。然后pod setup。最后pod search xxx這樣應該就可以了
CocoaPods的常見錯誤:http://blog.csdn.net/wangyanchang21/article/details/51437934
五. CocoaPods的說明
1、第三方庫會被編譯成.a靜態庫或者.framwork的動態鏈接庫供我們真正的工程使用。
CocoaPods會將所有的第三方庫以target的方式組成一個名為Pods的工程,該工程就放在剛才新生成的Pods目錄下。整個第三方庫工程會生成一個名稱為libPods.a的靜態庫提供給我們自己的CocoaPodsTest工程使用。
對于資源文件,CocoaPods提供了一個名為Pods-resources.sh的bash腳本,該腳本在每次項目編譯的時候都會執行,將第三方庫的各種資源文件復制到目標目錄中。
2、我們的工程和第三方庫所在的工程會由一個新生成的workspace管理
為了方便我們直觀的管理工程和第三方庫,CocoaPodsTest工程和Pods工程會被以workspace的形式組織和管理,也就是我們剛才看到的JYCocoaPodsTest.xcworkspace文件。
3、原來的工程設置已經被更改了,這時候我們直接打開原來的工程文件去編譯就會報錯,只能使用新生成的workspace來進行項目管理。
4、CocoaPods通過一個名為Pods.xcconfig的文件來在編譯時設置所有的依賴和參數。
六. 總結:
CocoaPods主要還是側重于使用,網速太慢我親測的都有點煩躁了。當然理解原理過程更好,我現在還是有很多地方不是很理解。希望共同努力吧。還是多看看官方文檔來學習一下不了解的。如果你喜歡就請點個喜歡吧^_^