如何為自己的庫(kù)添加cocoapods支持
國(guó)際慣例,寫(xiě)在正文前面感慨下人生暢談下理想,暴躁老猿可直接略過(guò)第一段??????
說(shuō)來(lái)慚愧,做iOS開(kāi)發(fā)兩年多了,cocoapods幾乎是每個(gè)項(xiàng)目都會(huì)用的到第三方庫(kù)管理工具,但是之前卻只是用cocoapods給自己的項(xiàng)目添加第三方庫(kù)而沒(méi)有想過(guò)如何為自己的庫(kù)添加cocoapods支持,最近公司項(xiàng)目需求要給第三方對(duì)接的團(tuán)隊(duì)寫(xiě)一個(gè)SDK,ok沒(méi)問(wèn)題,但是SDK完成后如何給對(duì)方呢?開(kāi)始是直接打包發(fā)過(guò)去,這樣目的達(dá)到了,但是,完美如我這樣的猿總感覺(jué)缺點(diǎn)什么,沉思三秒后我就找到了問(wèn)題所在,那就是,逼格不夠高啊!直接發(fā)文件過(guò)去完全不符合本猿做事情逼格至上的信條??!于是我就想到了cocoapods,也就引申出了今天這篇文章,下面就讓本猿給爾等說(shuō)道說(shuō)道這其中的歡(en)樂(lè)(yuan)趣(qing)事(chou)。

無(wú)論你是不是略過(guò)了第一段,本猿都要再啰嗦一句,做開(kāi)發(fā),看文檔很重要看文檔很重要看文檔很重要?。?!
1.在github為自己的庫(kù)創(chuàng)建一個(gè)倉(cāng)庫(kù)

2.將剛創(chuàng)建的這個(gè)庫(kù)拉取到本地
git clone https://github.com/xxxxx/-...-.git
拉下來(lái)后文件夾大概是這樣子的:

3.然后將自己的要處理的庫(kù)文件放入這個(gè)文件夾
Classes文件夾就是你要添加的庫(kù),然后推送至github遠(yuǎn)程倉(cāng)庫(kù)。
git add .
git add commit -m "為了被遺忘者!"
git push
注意:一般我們引用第三方庫(kù)都是與版本號(hào)的就像這樣:
pod 'Masonry', '~> 1.1.0'
后邊的1.1.0就是版本號(hào),所以我們的庫(kù)也是要有版本號(hào)的,不然那豈不是看起來(lái)很山寨?這還怎么提高逼格呢???
git tag 0.0.1
git push tags
至此,我們已經(jīng)將自己的庫(kù)傳至github,加入cocoapods的前置工作也完成了。
4.創(chuàng)建spec文件 這是加入cocoapods的配置文件
注意:本猿就是在這個(gè)文件上吃了大虧,文件中的許多配置信息填充都有特定的語(yǔ)法,詳情參見(jiàn)官方文檔cocoapods
pod spec create TestLibrary
TestLibrary就是你的庫(kù)的名字,文件內(nèi)容大概是下圖這個(gè)樣子的:
里邊有很多配置內(nèi)容,并且許多前邊加了#進(jìn)行了注釋,而我們其實(shí)并不需要這么多配置信息,只需留下關(guān)鍵部分即可
Pod::Spec.new do |s|
s.name = "TestLibrary"
s.version = "0.0.1"
s.summary = "簡(jiǎn)單描述"
s.description = <<-DESC
比簡(jiǎn)單描述長(zhǎng)一點(diǎn)的描述
DESC
s.homepage = "https://github.com/你的github/temp.git"
s.license = "MIT"
s.author = { "lazyloading" => "lazyloading@163.com" }
s.platform = :ios, "8.0"
s.source = { :git => "https://github.com/你的github/temp.git", :tag => "#{s.version}" }
s.source_files = "Classes", "Classes/**/*.{h,m}"
s.vendored_frameworks = "**/MySDK.framework"
大概需要的配置內(nèi)容就是上述這些了,需要其他配置的參見(jiàn)官方文檔cocoapods,下邊解釋下這些配置信息都代表什么:
- s.name : 你所創(chuàng)建的庫(kù)的名字,比如Masonry,AFNNetworking等等
- s.version : 庫(kù)的版本號(hào)
- s.summary : 簡(jiǎn)短的描述信息
- s.description : 比簡(jiǎn)短描述長(zhǎng)一點(diǎn)的描述信息
- s.homepage : 你的項(xiàng)目主頁(yè),一般寫(xiě)github地址
- s.license : 遵守的協(xié)議
- s.author : 你的cocoapods賬戶 ,后邊說(shuō)明怎么創(chuàng)建
- s.platform : 支持的平臺(tái)與系統(tǒng)版本
- s.source : 代碼的路徑,即在你的github中的路徑,后邊的tag就是第三步中我們所添加的tag,不寫(xiě)具體的版本默認(rèn)為最新版
- s.source_files : 要引入的文件
- s.vendored_frameworks : 靜態(tài)包的路徑
注意:特別需要注意的是s.source_files 和 s.vendored_frameworks的寫(xiě)法,本猿就在這里耗費(fèi)了大把的光陰,啊,我的青春啊。
s.source_files的寫(xiě)法默認(rèn)大概是這樣的s.source_files = "Classes/**/*.{h,m}"
其實(shí)就是你的庫(kù)項(xiàng)目中真正要讓第三方引入的文件的路徑,本猿就因?yàn)槁窂藉e(cuò)誤失敗了一次又一次,其中:
**是匹配所有的目錄
*是匹配所有的文件
.{h,m}是匹配后綴為.h或.m的文件
并且podsepc文件必須要在你的庫(kù)項(xiàng)目的根目錄下,而s.vendored_frameworks后邊跟你的frameworks的路徑(如果你的庫(kù)是以frameworks形式導(dǎo)入的話,這個(gè)字段必須加,否則不需要),本猿一開(kāi)始是是將所有代碼都開(kāi)放出去,所以沒(méi)有寫(xiě)這個(gè)配置信息,后來(lái)因?yàn)槟承┰虼蛩銓⑽募虬蒮rameworks發(fā)布出去,就添加了這個(gè)字段。
所有這些信息配置完成后我們來(lái)驗(yàn)證下配置信息的正確性:
pod spec lint TestLibrary.podspec --allow-warnings
或者不進(jìn)行驗(yàn)證直接發(fā)布到cocoapods:
pod trunk push TestLibrary.podspec --allow-warnings
后邊的--allow-warnings是可選參數(shù):
--allow-warnings 打印警告信息??
--verbose 打印錯(cuò)誤信息?
如果你進(jìn)行了驗(yàn)證并且通過(guò),我們要將修改后的項(xiàng)目信息提交到github:
git add .
git commit -m "修改spec"
git push
如果沒(méi)有進(jìn)行驗(yàn)證選擇直接發(fā)布到cocoapods你會(huì)發(fā)現(xiàn)失敗了?為什么呢?因?yàn)槲覀冞€沒(méi)與注冊(cè)cocoapods啊,是不是覺(jué)得我巴拉巴拉說(shuō)了這么一大堆這么重要的信息為什么前文沒(méi)說(shuō)?因?yàn)楸驹诚矚g在遇到錯(cuò)誤后去去尋找問(wèn)題原因,這樣記憶才更深刻,好了下邊說(shuō)如何注冊(cè)cocoapods:
pod trunk register lazyloading@163.com lazyloading --description="為了希爾瓦娜斯!" --verbose
其中郵箱必須真實(shí)有效,因?yàn)闀?huì)給你發(fā)驗(yàn)證郵件,lazyloading就是你的昵稱,description后邊跟的是描述信息如果收到郵件確認(rèn)成功我們可以查看賬戶信息:
pod trunk me
不出意外會(huì)出現(xiàn)類似如下信息:

這就說(shuō)明你注冊(cè)成功了(一般都會(huì)成功,如果不成功你要好好回想下是不是今天沒(méi)有扶老太太過(guò)馬路)
ok,到這里我們github倉(cāng)庫(kù)也創(chuàng)建了,庫(kù)文件也傳上去了,spec配置信息也編寫(xiě)完成,賬戶也有了,是不是就差最后一步了呢?對(duì),就是將這所有的操作轉(zhuǎn)化為成果的一步:
pod trunk push ZMTestLibrary.podspec --allow-warnings
最后一句代碼敲完是不是感覺(jué)一切都變得索然無(wú)味了呢,不要慌,以我的經(jīng)驗(yàn),一般這一步都會(huì)出錯(cuò),錯(cuò)誤原因不外物spec配置信息不對(duì),那么你就要根據(jù)錯(cuò)誤信息好好排查問(wèn)題出在哪了,我耗費(fèi)時(shí)間最多的地方就是s.source_files和s.vendored_frameworks路徑寫(xiě)錯(cuò)。
如果沒(méi)有報(bào)錯(cuò)你將會(huì)看到類似如下的信息:

小伙子可以啊,居然一發(fā)入孕,后生可畏后生可畏啊哈哈哈哈哈
哦,忘了說(shuō)一點(diǎn),也許你會(huì)問(wèn)為什么編寫(xiě)spec文件時(shí)候s.name明明寫(xiě)的TestLibrary后邊成功后顯示的卻是ZMTestLibrary呢?其實(shí)啊,是因?yàn)楸驹碁榱藢?xiě)這篇文章又重新走了一遍流程,而發(fā)布的庫(kù)名字不能相同所以就換了個(gè)名字,畢竟給你們寫(xiě)教程不能誤人子弟不是,不然背后豈不是要罵本猿不厚道,有坑不說(shuō)寫(xiě)的什么玩意這是....
那么,庫(kù)也發(fā)布成功了,下一步當(dāng)讓就是見(jiàn)證奇跡的時(shí)刻啦,我們來(lái)一起搜索下看能不能搜到
pod search ZMTestLibrary
敲這句代碼時(shí)候是不是激動(dòng)的手都在顫抖呢。不過(guò)不要慌,一般不會(huì)立馬搜到的,一般都會(huì)報(bào)如下錯(cuò)誤:
[!] Unable to find a pod with name, author, summary, or descriptionmatching '······'

那是因?yàn)?code>cocoapods處理需要一定的時(shí)間,這個(gè)不好把握,運(yùn)氣好的話幾分鐘完事,運(yùn)氣好的話,得嘞,您明兒個(gè)再來(lái)看吧。你如果對(duì)自己的人品和運(yùn)氣非常有自信卻還是沒(méi)有收到,不要慌,我們來(lái)更新下pod本地索引
pod setup
這一步安裝過(guò)cocoapods的小伙伴都知道,可能要費(fèi)點(diǎn)時(shí)間,啊,我寶貴的光陰啊。
如果這一步結(jié)束還么搜到,依然不要慌,刪除本地cocoapods緩存的本地索引文件
rm ~/Library/Caches/CocoaPods/search_index.json
完了之后再次執(zhí)行
pod search ZMTestLibrary
cocoapods會(huì)重新建立索引文件,不出意外你就會(huì)看到類似如下的信息:

至此,將自己的庫(kù)添加cocoapods已經(jīng)全部走完,你以為這就結(jié)束了嗎?不不不,少年,忘了我們最開(kāi)始我那段廢話說(shuō)的什么了嗎?當(dāng)然是在項(xiàng)目中引入使用啊,之前是只會(huì)用不會(huì)加總是拿來(lái)主義,現(xiàn)在添加也有了,是時(shí)候檢測(cè)一波成果了
創(chuàng)建一個(gè)項(xiàng)目,添加pod信息,這里我就不說(shuō)明了相信大家能看到這里都懂的,pod用的都不是一次兩次了,
最后:
pod install
走你
不出意外你會(huì)在項(xiàng)目中看到這樣的信息:

完美,逼格終于又提升了一截,嘴角不自覺(jué)揚(yáng)起了迷人的弧度

到這里本篇文章要講的內(nèi)容就已經(jīng)全部結(jié)束了,雖然不是很難的操作,但是對(duì)于某些開(kāi)發(fā)者來(lái)說(shuō)沒(méi)有需求就不會(huì)有去學(xué)習(xí)去探究的動(dòng)力,無(wú)論是多么淺顯的知識(shí)即使是1+1=2,你不去接觸就永遠(yuǎn)不會(huì),并且不斷地接觸學(xué)習(xí)新的東西,才會(huì)讓人生變得越來(lái)越有意思不是嗎?

