? ? ? ?最近在學(xué)習(xí)CocoaPods公有庫(kù)、本地私有庫(kù)、遠(yuǎn)程私有庫(kù),其中遇到了許多問題,怕過后又忘記了,所以記錄下來幫助自己也幫助他人少走彎路。做iOS 3年多未寫過什么文章,感覺自己都對(duì)不起自己的技術(shù)了,新手第一次寫文章,大神不要噴我?,F(xiàn)在面試聽說要求很多,都要GitHub有開源項(xiàng)目,有博客分享過技術(shù)文章...,生活不易呀,為了生存。????
? ? ? ?這文章先說說CocoaPods公有庫(kù),接下來的文章就講講本地私有庫(kù)、遠(yuǎn)程私有庫(kù)。啥叫CocoaPods公有庫(kù)?比如我們經(jīng)常用到第三方庫(kù)AFNetworking、SDWebImage、MBProgressHUD,本人理解的CocoaPods公有庫(kù)就是把自己做好的庫(kù)、項(xiàng)目功能模塊上傳到開源倉(cāng)庫(kù),上傳CocoaPods的開源索引庫(kù)repo,通過CocoaPods管理自己的庫(kù)或者模塊。這樣管理項(xiàng)目就方便了,直接用CocoaPods安裝即可。
一、安裝cocoapod或更新cocoapods
需要安裝新版的cocoapods,舊版的cocoapods可能不支持,會(huì)導(dǎo)致下面的步驟出錯(cuò),所以先要更新cocoapods。我是用最新的1.5.0 beta版,如圖:

我這里就不說安裝cocoapods或者更新cocoapods了,請(qǐng)大家網(wǎng)上搜一下教程。
更新cocoapods的簡(jiǎn)單步驟:
$ sudo gem update --system// 先更新gem;
$ sudo gem install cocoapods// 安裝cocoapods
$ pod setup//設(shè)置
如果gem升級(jí)失敗,可能是ruby版本過低導(dǎo)致的,安裝RVM來升級(jí)ruby。
二、創(chuàng)建遠(yuǎn)程倉(cāng)庫(kù)與本地代碼關(guān)聯(lián)
先在GitHub上創(chuàng)建新項(xiàng)目,這里我就直接用例子了,如圖所示:

? ? ? ?這里用的是選擇公有庫(kù),私有的要錢的,最好添加ignore和證書license,證書在后面用到,可以去掉警告。創(chuàng)建成功項(xiàng)目里就只有ignore和license,選擇地址clone項(xiàng)目到桌面。

? ? ? cd到桌面,或者你想要的文件夾,clone項(xiàng)目到本地。

? ? ? ?打開剛才clone的文件夾,我這里就直接用庫(kù),不帶demo的,如果你們想要帶demo的話也是一樣的道理,只是路徑填好就行了。一般在庫(kù)里面創(chuàng)建Classes文件夾,名稱隨意,.podspec的資源路徑填好就沒問題,然后把你的庫(kù)或者模塊放在Classes文件夾里面,我就用我自己做的一個(gè)庫(kù),如圖:

? ? ? 我這邊就把遠(yuǎn)程庫(kù)和本地代碼關(guān)聯(lián)了,只是沒有把代碼上傳帶遠(yuǎn)程倉(cāng)庫(kù),你們也可以直接在本地創(chuàng)建庫(kù)名,然后通過命令?git remote add origin 遠(yuǎn)程倉(cāng)庫(kù)地址?關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù) ,這我就不示范了。
三、創(chuàng)建.podspec文件和修改.podspec文件的內(nèi)容
? ? ? ?接著cd到庫(kù),命令執(zhí)行,$ pod spec create PublicLib?// PublicLib是你的庫(kù)名稱,這里創(chuàng)建.podspec文件,這個(gè)文件就是最重要的。你再去看看你的庫(kù)是不是多了一個(gè).podspec文件,如圖:

? ? ? 打開.podspec文件,通過xcode打開,修改相應(yīng)的內(nèi)容,想詳細(xì)了解更多的.podspec文件內(nèi)容,請(qǐng)看官網(wǎng)介紹:Specs and the Specs Repo。把不需要的刪除,修改完后如圖:

? ? ? ? .podspec文件內(nèi)容那么多,為啥就只剩這一點(diǎn)點(diǎn)了,#開頭的是注釋的,用不到的,看著有點(diǎn)亂,所以就刪了。
s.name一般不需要修改,它對(duì)應(yīng).podspec文件的名字,如果不相同就會(huì)報(bào)錯(cuò);
s.version是你庫(kù)的版本號(hào);
s.version庫(kù)簡(jiǎn)介;
s.description庫(kù)描述,這個(gè)庫(kù)描述一定要比簡(jiǎn)介長(zhǎng);
s.homepage遠(yuǎn)程倉(cāng)庫(kù)的主頁(yè),對(duì)應(yīng)你項(xiàng)目庫(kù)的主頁(yè),不是項(xiàng)目地址,不帶.git后綴的;
s.license是證書,剛開始創(chuàng)建遠(yuǎn)程項(xiàng)目時(shí)選擇的;
s.author作者聯(lián)系名和郵箱;
s.platform支持的平臺(tái),這個(gè)必須要的,要不會(huì)包錯(cuò),包沒有找到頭文件或者沒有找到UIKit;
s.source資源的地址和tag,這里的地址是庫(kù)的地址,帶.git的,tag要對(duì)應(yīng)遠(yuǎn)程的tag;
s.source_files資源文件,通過這路徑找到對(duì)應(yīng)的文件;
s.public_header_files暴露的.h文件,用到靜態(tài)庫(kù);
s.requires_arc是否支持ARC;
s.ios.vendored_libraries靜態(tài)庫(kù)路徑,我這里用到了靜態(tài)庫(kù)。
? ? ? ? ?這里如果沒有填寫正確,會(huì)遇到很多坑,文件路徑一定要填寫好,如果我這里不是直接Classes文件夾,而是Classes文件夾在Lib文件里面,Lib文件是跟.podspec文件同目錄的,那么路徑就要Lib/Classes/**/;還有這里你有沒有發(fā)現(xiàn)我的靜態(tài)庫(kù).a文件跟.h文件名字不一樣,那是我后來改的,如果用到了系統(tǒng)外的就要以lib開頭的.a,所以我就在原來的基礎(chǔ)上更改了。這是我查了很久資源才知道的,當(dāng)時(shí)一直報(bào)錯(cuò)。。。
溫馨提示:
? ? ? ?.podspec文件的內(nèi)容配置要根據(jù)你的項(xiàng)目庫(kù)來填寫,里面還有許多我沒有用到的,比如資源庫(kù)、依賴第三方的庫(kù)、frame框架、系統(tǒng)的庫(kù)等等。這些都需要你們到官網(wǎng)看看介紹,或者看其他人的介紹,這我就不一一介紹了。
這些在別人文章找到的:
vendored_frameworks:配置需要引用的非系統(tǒng)框架
寫法:vendored_frameworks ='Frameworks/LibFramework.framework'
frameworks:配置依賴的系統(tǒng)框架
寫法:frameworks ='AVFoundation','CoreGraphics','Security','SystemConfiguration'
vendored_libraries:配置需要引用的非系統(tǒng)靜態(tài)庫(kù)(要注意,這里的.a靜態(tài)庫(kù)名字必須要帶lib前綴,如果引用的靜態(tài)庫(kù)名字沒lib前綴會(huì)導(dǎo)致編譯報(bào)錯(cuò),只需要重命名加上即可)
寫法:vendored_libraries ='Classes/libQYHKeyBoardManager.a'
libraries:配置依賴的系統(tǒng)庫(kù)(要注意,這里的寫法需要忽略lib前綴)
寫法:libraries ='c++','sqlite3','stdc++.6.0.9','z'
resources:配置資源文件(.bundle,.png,.txt等資源文件,這些資源文件會(huì)被放到mainBundle中,要注意避免發(fā)生命名重復(fù)的問題)
寫法:resources ='Resources/QYHKeyBoard.bundle'
resource_bundles:配置指定bundle的資源文件(可以解決resources導(dǎo)致的命名沖突問題)
寫法:resource_bundles = {'QYHKeyBoardBundle'=> ['Resources/QYHKeyBoard.bundle'],}
dependency:依賴的三方庫(kù)
寫法:dependency 'AFNetworking','~>3.1.0'
四、把本地代碼上傳到遠(yuǎn)程倉(cāng)庫(kù)和打tag版本
配置好.podspec文件,接著就是把代碼上傳到遠(yuǎn)程倉(cāng)庫(kù),通過
????$ git add . ; ?
????$ git commit -m “XX” ?;?
????$ git push。
打tag,打的tag一定要對(duì)應(yīng)版本號(hào),因?yàn)?podspec文件配置已經(jīng)寫好跟版本號(hào)一樣的,通過
? ? $ git tag '0.0.1' ;?
? ? $ git push --tags;
如圖所示:



五、注冊(cè)Cocoapods賬號(hào)
? ? ? ?可以先查看你本機(jī)有沒有注冊(cè)過Cocoapods賬號(hào),通過 $ pod trunk me ,如果沒有信息就證明沒有注冊(cè)過,需要注冊(cè)。輸入$ pod trunk register 郵箱地址 ‘用戶名’ --description='描述信息' 注冊(cè),然后在你注冊(cè)的郵箱收到郵件,打開郵件復(fù)制鏈接打開網(wǎng)頁(yè)激活驗(yàn)證注冊(cè),然后跳到pod官網(wǎng)提示pod trunk push。
????$ pod trunk me //查看有沒有注冊(cè),有的話就是相關(guān)的注冊(cè)賬號(hào)的信息
????$ pod trunk register ?郵箱地址 ?‘用戶名’ --description='描述信息' ?//注冊(cè)Cocoapods賬號(hào)
????$ pod trunk push xx.podspec --allow-warnings //提交到pod,最后用到
如圖是本人自己操作的,pod trunk me有顯示庫(kù),是我之前弄的。



六、驗(yàn)證pod是否能通過
上傳代碼后,然后驗(yàn)證pod是否能通過:
? ??$ pod lib lint ? 本地驗(yàn)證?
? ??$ pod spec lint ?本地和遠(yuǎn)程驗(yàn)證
? ??$ pod lib lint --verbose 顯示詳細(xì)的檢測(cè)過程,出錯(cuò)時(shí)會(huì)顯示詳細(xì)的錯(cuò)誤信息
? ??$ pod lib lint --allow-warnings ?允許警告,用來解決存在警告導(dǎo)致不能通過校驗(yàn)的問題
如果出現(xiàn)綠色字passed validation就是驗(yàn)證通過,如圖所示:

七、提交pod和檢查庫(kù)
pod驗(yàn)證通過了,就接著執(zhí)行$ pod trunk push xx.podspec --allow-warnings,等幾分鐘,結(jié)果報(bào)錯(cuò)了。

? ? ? ? pod上面已經(jīng)有相應(yīng)的名稱了,所以要更改名稱了。我目錄的文件夾和.podspec文件名和.podspec文件里面的s.name都全部更改了,要不會(huì)報(bào)錯(cuò),如圖:

這次成功了,如果所示:

再執(zhí)行$ pod trunk me 可以看到自己的信息,包括自己的庫(kù),如上圖所示。
然后通過搜索庫(kù)看能不能搜索出來,$ pod search XX ,結(jié)果搜不出來,因?yàn)槭莗od的緩存問題,是從緩存的repo搜索的。把緩存刪除了,通過$?rm ~/Library/Caches/CocoaPods/search_index.json 把緩存刪掉,再$ pod search XX搜重新從網(wǎng)上搜索緩存下來。如圖,如果能搜到就成功了,直接就可以用pod 安裝管理了。
????$ pod search XX ? ?//搜索庫(kù)
????$?rm ~/Library/Caches/CocoaPods/search_index.json ?//刪除pod的緩存


八、版本更新
版本更新跟之前的步驟差不多,這就簡(jiǎn)單說一下步驟:
????1.修改.podspec文件中的版本號(hào);
????????s.version? ? ? = "0.0.2" //修改0.0.2版本,不能是之前的版本,要不提交不成功
????2.上傳到遠(yuǎn)程倉(cāng)庫(kù);
? ??????$ git add . ; ?
? ?? ???$ git commit -m “XX” ?;?
? ??? ??$ git push。
????3.打tag并上傳;
? ??????$ git tag '0.0.2' ;? ??
? ?? ???$ git push --tags;
????4.驗(yàn)證pod并提交到pod。
?? ??????$?spec repo ? ?//查詢r(jià)epo
? ??? ???$?pod spec lint --allow-warnings ? ?//遠(yuǎn)程本地pod驗(yàn)證
? ??? ???$?pod trunk push ?PublicLibQiuyh.podspec?--allow-warnings ??//提交pod
? ??? ???$?pod search PublicLibQiuyh ? //查詢庫(kù)
第一次寫文章,用了好久的時(shí)間,不過有點(diǎn)成就感,嘻嘻?。?!
下次就是寫本地私有庫(kù)和遠(yuǎn)程私有庫(kù)了...
喜歡點(diǎn)個(gè)贊唄?。。?/p>