相信每個Developer都會在使用Cocoapods這兒第三方庫管理工具,雖然有時候pod install的時候會有種想死的感覺o(╯□╰)o,但依然無法阻擋某些程序員去使用它的熱情,why?因為它能使你的項目工程看起來更加簡潔,更加有條理性,而不至于使自己項目的Vendor文件夾看起來臃腫,而且能減少手動導入靜態(tài)framework的麻煩,也可以將自己封裝好的代碼提交到Trunk供自己和別人使用,的確方便。
但有時候我們將代碼封裝起來后,想要重復利用,又不想push到Trunk(畢竟在又要驗證又要被墻什么的,麻煩),這時就需要使用到私有庫了,作為小白和英語四級都沒過的“程序猿”,在Cocoapods上的確踩了不少的坑,而且Cocoapods官網(wǎng)上面的流程看起來比較官方,只把一些主要的步驟標記出來,根本就沒有一個完成的流程,而且全英文,看起來有點吃力(畢竟我是中國人O(∩_∩)O~)
那么我們就不扯遠了,什么是私有庫?
私有庫及公有庫理解
在我看來,私有庫就是自己封裝的Code放到不開源的代碼倉庫,而GitHub就是一個管理開源Code的代碼倉庫,相信很多同學都是通過在GitHub上開源自己封裝好的組件的,畢竟有好東西要學會分享?(? ? ??)嘿嘿
Cocoapods的原理及目錄結構
Cocoapods一共分成兩塊,就是Cocoapods和Specs,Specs是一個目錄容器,將所有的第三方的podspec存放在這里,而podspec就相當于是這個庫的介紹文件,里面包含了庫的名字、版本、下載地址等信息
注意項
- ~/.cocoapods/repos/master
開源第三方庫管理podspec的地方,這個文件夾是在使用Cocoapods的時候自動從Specs上clone到本地的
基本目錄結構:
repos->master->Specs->[Name]->[Version]->[Name].podspec
這個就是共有的第三方的目錄,我們要做私有庫,可以模仿共有庫的目錄結構,建立一個自己的Spec私有倉庫來維護,以后我們要維護的東西基本就兩樣:
1. 私有的Specs目錄
2. 我們要上傳的庫
步驟
一、創(chuàng)建私有的Specs目錄
在遠端(GitHub\其他代碼管理服務器,因為我使用的是GitHub,所以下文說到的遠端都是指GitHub)建一個倉庫,命名為MySpecs,將倉庫clone到本地(可以是桌面或指定文件夾下),將共有的Cocoapods-version.yml文件拷貝到里面,并創(chuàng)建一個命名為“Specs”的文件夾(在文件夾里面隨意的文件,只要不是空文件夾就行了,因為如果是空文件夾的話在push到遠端的時候會被忽略),然后推送到遠端,就這樣,遠端的Specs倉庫已經創(chuàng)建完成了,這時本地和遠端都會有了兩個同步的庫,如圖:


二、將遠端的私有Specs倉庫clone到本地.cocoapods目錄下
在終端運行:
$ pod repo add MySpecs https://github.com/CharlsPrince/MySpecs.git
MySpecs 指的是倉庫的名字,后面的路徑就是倉庫在遠端的路徑,這個是根據(jù)每個人遠端倉庫的路徑而定的,將路徑改成你的遠端路徑就行了
三、創(chuàng)建一個podspec文件
cd到工程文件目錄下 ,在終端執(zhí)行命令:
$ pod spec create CommonExtension https://github.com/CharlsPrince/CommonExtension.git
CommonExtension 指的是這個podspec文件的名字,后面的路徑就是這個工程在遠端的路徑,當然,如果要實現(xiàn)這一步,你需要先將你的工程push到遠端,至于怎么push,這里就不詳細介紹了,因為如果你使用不同的代碼管理服務器方法也不盡相同,執(zhí)行完了以后你會發(fā)現(xiàn)在當前的這個工程文件目錄下回出現(xiàn)一個叫CommonExtension.podspec的文件

用sublime打開這個文件,沒有sublime的也可以使用系統(tǒng)自帶的文本編輯器打開,只不過用sublime打開可以將編輯語言改成Ruby,這樣這些文本就會高亮顯示了,編輯podspec里面的信息:
s.name = "xxxx" #庫的名字
s.version = "0.0.1" #版本號,當私有庫需要更新的時候只要修改這個值,自行維護
s.summay = "xxxxxx" #庫的簡介,pod search 顯示在上面的介紹
s.description = "xxxxxxxx" #庫的詳細描述
s.homepage = "https://xxxx" #主頁地址,pod search 會顯示,一般填寫倉庫的地址就行了
s.license = "MIT" #開源協(xié)議,項目文件目錄下需要有一個MIT開源協(xié)議文件
s.author = { "name" => "xxxxxx@qq.com" } #作者名字、郵箱
s.platform = :ios, "7.0" #庫最低支持的系統(tǒng)版本
s.source = { :git => "https://github.com/CharlsPrince/CommonExtension.git", :tag => "#{s.version}" } #資源地址,pod install 的時候會根據(jù)這個地址去下載你的想要庫,以及下載的版本,必須要跟s.version一致。
s.source_files = "xxxx" #這個很重要,指定資源文件,前綴就是.podspec文件當前路徑,只用寫之后的路徑,如Class/*是指Class文件夾下的所有文件,但不包括子文件夾里面的文件、Class/**/*是指包含所有Class文件夾下的文件,包括子文件、Class/**/*.{h,m}是指包含所有Class文件夾下的后綴為.h或.m的文件,當然也可以指定文件。
s.requires_arc = true #是否支持arc
>>>>>以下是可選描述<<<<<
#s.resource = "icon.png" #資源文件,包括圖片和xib文件
# s.dependency "JSONKit", "~> 1.4" #需要依賴的三方庫
#s.framework = "SomeFramework" #需要依賴的框架
#s.public_header_files = '' #公開的頭文件,如果不沒公開,用戶在用的時候可能引不到響應的頭文件
s.subspec 'subFolder' do |ss|
ss.source_files = 'Class/xxx/**/*.{h,m}'
ss.public_header_files = "Class/xxx/**/*.{h}"
end #這個是子依賴庫,因為如果我們只是用s.source_files來指定文件,那么用戶在pod下來之后所有的文件都在同一個目錄下,沒有子文件夾,如果想要分下類,用s.subspec,每一個subspec可以分一個子文件夾,但是記得一定要將.h文件通過ss.public_header_files公開,不然有可能會找不到頭文件。
當然還有一些其他的,詳細介紹可以去Cocoapods看看或可以看看AFNetworking的podspec,他們寫得很正規(guī)和簡潔。
四、驗證podspec合法性
如果終端是在項目的當前目錄下就直接執(zhí)行一下命令,否則你需要cd到你要驗證的.podspec的文件目錄下:
$ pod lib lint
或
$ pod spec lint
注意項
- pod lib lint 所編譯的源代碼是來自于podspec所在目錄而不是source所指定git地址
- pod spec lint 會聯(lián)網(wǎng)校驗,通過source中的git地址獲取源代碼,同時還會校驗git地址上是否有對應version字段的tag
- 執(zhí)行完,如果有錯就根據(jù)錯誤修改podspec文件,通過則繼續(xù)
- 基本通過的話你就直接可以使用這個庫了,可以創(chuàng)建一個工程試驗一下,在這個新建個工程里面新建一個Podfile文件并輸入
pod '[Name]', :podspec => '/Users/xxxx/Desktop/xxx/xxx.podspec'
注:[Name]為pod spec中的s.name,必須一致,后面的路徑為本地pod spec文件的路徑。
- 然后cd到這個Podfile的目錄下執(zhí)行
pod install
或
pod install --no-repo-update
第二條命令是不更新官方Specs至本地,速度要比第一條快,沒有必要每次都更新官方的Specs,這會使人崩潰。
不出意外的話打開你這個工程,你會發(fā)現(xiàn)工程已經引入這個庫了
五、向Specs遠端提交.podspec文件
cd到你的.podspec文件目錄下
驗證通過后,給當前代碼打上tag,建議tag和版本號一致,并push到遠端(官網(wǎng)的tag是不能向下修改的),這時候打開你的遠端,你會發(fā)現(xiàn)出現(xiàn)了你提交的tag
$ git tag "0.0.1"
$ git push origin --tags

將tag推送到遠端以后,向自己的私有庫提交podspec文件:
$ pod repo push MySpecs [name].podspec
如果提交成功,去~/.cocoapods/repos/MySpecs文件夾下就能找到你創(chuàng)建的私有庫了,當然,只是podspec文件哦,因為~/.cocoapods/repos/只是用來保存podspec文件的嘛
到這,你的私有庫就已經創(chuàng)建完成了
問題小結
1、執(zhí)行pod lib create (組件庫) 出錯
提示錯誤:rubygems/core_ext/kernel_require.rb:120:in `require': cannot load such file -- colored2
(LoadError)
解決辦法:
輸入上面提示的colored2的兩條gem命令即可解決問題
sudo gem install colored2
sudo gem update --system
2、添加組件庫到私有spec repo倉庫后 執(zhí)行 pod search搜索不到。
方法一:
先確認你本地倉庫上面確實有你新創(chuàng)建的組件庫,這時候可以先刪除search緩存文件
rm ~/Library/Caches/CocoaPods/search_index.json,刪除后從新執(zhí)行pod search ***
方法二:
1.切換到某個項目(含有podfile文件)下
2.執(zhí)行pod update(提示不能更新)
3.嘗試 pod repo update —verbose獲取詳細信息,我記得是提示我刪除一個 index.lock文件,
4.刪除后從新 執(zhí)行 pod repo update —verbose 會更新本地私有庫和master倉庫
5.執(zhí)行pod search *** 創(chuàng)建search索引,可以搜到
3、提交本地podspec到Specs倉庫的時候出錯,提示repo 文件夾下的spec repo is not clean
方法一: cd到spec repo 文件夾下,執(zhí)行 git clean -f
方法二:cd到spec repo 文件夾下,執(zhí)行 git stash
方法三: 刪除spec repo 下的Specs倉庫,我這里的是“MySpecs”,然后重新從git上將私有倉庫clone下來:
pod repo add MySpecs https://github.com/CharlsPrince/MySpecs.git

注意:
- 每次提交本地podspec到Specs倉庫都要將Specs提交到git遠程服務器,確保本地倉庫與遠程倉庫同步
六、查詢私有庫并使用
不出意外,這個時候,你去終端pod search 你的三方庫名字,就能搜到(如果你的名字和官方Specs里面的某個三方庫名字一樣的話將會搜不到),使用的時候在Podfile中加入兩個Specs源即:
官方源:
私有源:
source 'https://github.com/CharlsPrince/CommonExtension.git' #即你的私有源倉庫地址
當然,你也可以指定地址
pod 'xxxx', :git =>'https://github.com/CharlsPrince/CommonExtension.git'
或
pod 'xxx', :podspec => 'xxxx.podspec'

看到這個界面是不是有點小激動?之前弄的時候踩了不少坑,希望大家不要像我一樣踩坑了?。?!花了差不多一個下午時間才整理出來,希望能幫到同學們,謝謝,喜歡的點個??。