創(chuàng)建屬于自己的私有庫

相信每個Developer都會在使用Cocoapods這兒第三方庫管理工具,雖然有時(shí)候pod install的時(shí)候會有種想死的感覺o(╯□╰)o,但依然無法阻擋某些程序員去使用它的熱情,why?因?yàn)樗苁鼓愕捻?xiàng)目工程看起來更加簡潔,更加有條理性,而不至于使自己項(xiàng)目的Vendor文件夾看起來臃腫,而且能減少手動導(dǎo)入靜態(tài)framework的麻煩,也可以將自己封裝好的代碼提交到Trunk供自己和別人使用,的確方便。

但有時(shí)候我們將代碼封裝起來后,想要重復(fù)利用,又不想push到Trunk(畢竟在又要驗(yàn)證又要被墻什么的,麻煩),這時(shí)就需要使用到私有庫了,作為小白和英語四級都沒過的“程序猿”,在Cocoapods上的確踩了不少的坑,而且Cocoapods官網(wǎng)上面的流程看起來比較官方,只把一些主要的步驟標(biāo)記出來,根本就沒有一個完成的流程,而且全英文,看起來有點(diǎn)吃力(畢竟我是中國人O(∩_∩)O~)

那么我們就不扯遠(yuǎn)了,什么是私有庫?

私有庫及公有庫理解

在我看來,私有庫就是自己封裝的Code放到不開源的代碼倉庫,而GitHub就是一個管理開源Code的代碼倉庫,相信很多同學(xué)都是通過在GitHub上開源自己封裝好的組件的,畢竟有好東西要學(xué)會分享?(? ? ??)嘿嘿

Cocoapods的原理及目錄結(jié)構(gòu)

Cocoapods一共分成兩塊,就是CocoapodsSpecs,Specs是一個目錄容器,將所有的第三方的podspec存放在這里,而podspec就相當(dāng)于是這個庫的介紹文件,里面包含了庫的名字、版本、下載地址等信息

注意項(xiàng)

  • ~/.cocoapods/repos/master

開源第三方庫管理podspec的地方,這個文件夾是在使用Cocoapods的時(shí)候自動從Specs上clone到本地的
基本目錄結(jié)構(gòu):
repos->master->Specs->[Name]->[Version]->[Name].podspec

這個就是共有的第三方的目錄,我們要做私有庫,可以模仿共有庫的目錄結(jié)構(gòu),建立一個自己的Spec私有倉庫來維護(hù),以后我們要維護(hù)的東西基本就兩樣:

1. 私有的Specs目錄
2. 我們要上傳的庫

步驟

一、創(chuàng)建私有的Specs目錄

在遠(yuǎn)端(GitHub\其他代碼管理服務(wù)器,因?yàn)槲沂褂玫氖荊itHub,所以下文說到的遠(yuǎn)端都是指GitHub)建一個倉庫,命名為MySpecs,將倉庫clone到本地(可以是桌面或指定文件夾下),將共有的Cocoapods-version.yml文件拷貝到里面,并創(chuàng)建一個命名為“Specs”的文件夾(在文件夾里面隨意的文件,只要不是空文件夾就行了,因?yàn)槿绻强瘴募A的話在push到遠(yuǎn)端的時(shí)候會被忽略),然后推送到遠(yuǎn)端,就這樣,遠(yuǎn)端的Specs倉庫已經(jīng)創(chuàng)建完成了,這時(shí)本地和遠(yuǎn)端都會有了兩個同步的庫,如圖:


本地倉庫.png
遠(yuǎn)程倉庫.png

二、將遠(yuǎn)端的私有Specs倉庫clone到本地.cocoapods目錄下

在終端運(yùn)行:

$ pod repo add MySpecs https://github.com/CharlsPrince/MySpecs.git

MySpecs 指的是倉庫的名字,后面的路徑就是倉庫在遠(yuǎn)端的路徑,這個是根據(jù)每個人遠(yuǎn)端倉庫的路徑而定的,將路徑改成你的遠(yuǎn)端路徑就行了

三、創(chuàng)建一個podspec文件

cd到工程文件目錄下 ,在終端執(zhí)行命令:

$ pod spec create CommonExtension https://github.com/CharlsPrince/CommonExtension.git

CommonExtension 指的是這個podspec文件的名字,后面的路徑就是這個工程在遠(yuǎn)端的路徑,當(dāng)然,如果要實(shí)現(xiàn)這一步,你需要先將你的工程push到遠(yuǎn)端,至于怎么push,這里就不詳細(xì)介紹了,因?yàn)槿绻闶褂貌煌拇a管理服務(wù)器方法也不盡相同,執(zhí)行完了以后你會發(fā)現(xiàn)在當(dāng)前的這個工程文件目錄下回出現(xiàn)一個叫CommonExtension.podspec的文件

podspec文件.png

用sublime打開這個文件,沒有sublime的也可以使用系統(tǒng)自帶的文本編輯器打開,只不過用sublime打開可以將編輯語言改成Ruby,這樣這些文本就會高亮顯示了,編輯podspec里面的信息:

s.name = "xxxx" #庫的名字
s.version = "0.0.1" #版本號,當(dāng)私有庫需要更新的時(shí)候只要修改這個值,自行維護(hù)
s.summay = "xxxxxx" #庫的簡介,pod search 顯示在上面的介紹
s.description = "xxxxxxxx" #庫的詳細(xì)描述
s.homepage = "https://xxxx" #主頁地址,pod search 會顯示,一般填寫倉庫的地址就行了
s.license = "MIT" #開源協(xié)議,項(xiàng)目文件目錄下需要有一個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 的時(shí)候會根據(jù)這個地址去下載你的想要庫,以及下載的版本,必須要跟s.version一致。
s.source_files = "xxxx" #這個很重要,指定資源文件,前綴就是.podspec文件當(dāng)前路徑,只用寫之后的路徑,如Class/*是指Class文件夾下的所有文件,但不包括子文件夾里面的文件、Class/**/*是指包含所有Class文件夾下的文件,包括子文件、Class/**/*.{h,m}是指包含所有Class文件夾下的后綴為.h或.m的文件,當(dāng)然也可以指定文件。
s.requires_arc = true #是否支持arc
>>>>>以下是可選描述<<<<<
#s.resource  = "icon.png" #資源文件,包括圖片和xib文件
# s.dependency "JSONKit", "~> 1.4" #需要依賴的三方庫
#s.framework  = "SomeFramework" #需要依賴的框架
#s.public_header_files = '' #公開的頭文件,如果不沒公開,用戶在用的時(shí)候可能引不到響應(yīng)的頭文件
s.subspec 'subFolder' do |ss|
    ss.source_files = 'Class/xxx/**/*.{h,m}'
    ss.public_header_files = "Class/xxx/**/*.{h}"
end   #這個是子依賴庫,因?yàn)槿绻覀冎皇怯胹.source_files來指定文件,那么用戶在pod下來之后所有的文件都在同一個目錄下,沒有子文件夾,如果想要分下類,用s.subspec,每一個subspec可以分一個子文件夾,但是記得一定要將.h文件通過ss.public_header_files公開,不然有可能會找不到頭文件。

當(dāng)然還有一些其他的,詳細(xì)介紹可以去Cocoapods看看或可以看看AFNetworking的podspec,他們寫得很正規(guī)和簡潔。

四、驗(yàn)證podspec合法性

如果終端是在項(xiàng)目的當(dāng)前目錄下就直接執(zhí)行一下命令,否則你需要cd到你要驗(yàn)證的.podspec的文件目錄下:

$ pod lib lint

$ pod spec lint

注意項(xiàng)

  • pod lib lint 所編譯的源代碼是來自于podspec所在目錄而不是source所指定git地址
  • pod spec lint 會聯(lián)網(wǎng)校驗(yàn),通過source中的git地址獲取源代碼,同時(shí)還會校驗(yàn)git地址上是否有對應(yīng)version字段的tag
  • 執(zhí)行完,如果有錯就根據(jù)錯誤修改podspec文件,通過則繼續(xù)
  • 基本通過的話你就直接可以使用這個庫了,可以創(chuàng)建一個工程試驗(yàn)一下,在這個新建個工程里面新建一個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)工程已經(jīng)引入這個庫了

五、向Specs遠(yuǎn)端提交.podspec文件

cd到你的.podspec文件目錄下
驗(yàn)證通過后,給當(dāng)前代碼打上tag,建議tag和版本號一致,并push到遠(yuǎn)端(官網(wǎng)的tag是不能向下修改的),這時(shí)候打開你的遠(yuǎn)端,你會發(fā)現(xiàn)出現(xiàn)了你提交的tag

$ git tag "0.0.1"
$ git push origin --tags

遠(yuǎn)端tag.png

將tag推送到遠(yuǎn)端以后,向自己的私有庫提交podspec文件:

$ pod repo push MySpecs [name].podspec

如果提交成功,去~/.cocoapods/repos/MySpecs文件夾下就能找到你創(chuàng)建的私有庫了,當(dāng)然,只是podspec文件哦,因?yàn)?code>~/.cocoapods/repos/只是用來保存podspec文件的嘛

到這,你的私有庫就已經(jīng)創(chuàng)建完成了

問題小結(jié)

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搜索不到。

方法一:
    先確認(rèn)你本地倉庫上面確實(shí)有你新創(chuàng)建的組件庫,這時(shí)候可以先刪除search緩存文件
    rm ~/Library/Caches/CocoaPods/search_index.json,刪除后從新執(zhí)行pod search ***
方法二:
    1.切換到某個項(xiàng)目(含有podfile文件)下
    2.執(zhí)行pod update(提示不能更新)
    3.嘗試 pod repo update —verbose獲取詳細(xì)信息,我記得是提示我刪除一個 index.lock文件,
    4.刪除后從新 執(zhí)行  pod repo update —verbose  會更新本地私有庫和master倉庫
    5.執(zhí)行pod search ***   創(chuàng)建search索引,可以搜到

3、提交本地podspec到Specs倉庫的時(shí)候出錯,提示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
the repo "xxx" at "xxx" is no clean

注意:

  • 每次提交本地podspec到Specs倉庫都要將Specs提交到git遠(yuǎn)程服務(wù)器,確保本地倉庫與遠(yuǎn)程倉庫同步

六、查詢私有庫并使用

不出意外,這個時(shí)候,你去終端pod search 你的三方庫名字,就能搜到(如果你的名字和官方Specs里面的某個三方庫名字一樣的話將會搜不到),使用的時(shí)候在Podfile中加入兩個Specs源即:
官方源:

source 'https://github.com/CocoaPods/Specs.git'

私有源:

source 'https://github.com/CharlsPrince/CommonExtension.git' #即你的私有源倉庫地址

當(dāng)然,你也可以指定地址

pod 'xxxx', :git =>'https://github.com/CharlsPrince/CommonExtension.git'

pod 'xxx', :podspec => 'xxxx.podspec'

pod search.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容