年前調(diào)研了關(guān)于組件化的一些實(shí)施方案,最終確定將項(xiàng)目進(jìn)行分層和業(yè)務(wù)拆分成獨(dú)立工程,為了便于管理,業(yè)務(wù)組件和業(yè)務(wù)庫(kù)采用CocoaPods做依賴管理。因?yàn)槭撬接械拇a,所以一定不希望別人都可以搜索到,那第一步就是建立自己的私有倉(cāng)庫(kù),即私有spec repo。
Spec Repo
所謂Spec Repo,就是Pods的索引。一旦在podfile中設(shè)置source為某個(gè)私有repo的git地址,在進(jìn)行pod update的時(shí)候就會(huì)去這個(gè)repo中進(jìn)行檢索,如果檢索到對(duì)應(yīng)的pod,會(huì)讀取該P(yáng)od的podspec從而進(jìn)行安裝。建立私有repo很簡(jiǎn)單,首先在gitlab創(chuàng)建一個(gè)倉(cāng)庫(kù)

復(fù)制git地址,然后在本地終端執(zhí)行以下命令,
pod repo add EthercapPrivateSpechttp://git.ethercap.com/mobile-componentization/EthercapPrivateSpec.git
add后面代表私有庫(kù)索引的名稱,可以和git倉(cāng)庫(kù)的名稱不同,這里為了方便,我取了一樣的名字。執(zhí)行成功之后,可以在cocoapods目錄下看到自己的spec文件夾

這里提以下,repos里面的master文件夾,就是cocoapods的主索引,平時(shí)我們使用的SDWebImage,AFNetworking都是從這里進(jìn)行的搜索和匹配
創(chuàng)建私有倉(cāng)庫(kù)
建立好私有索引后,就可以繼續(xù)下一步,創(chuàng)建自己的私有倉(cāng)庫(kù),這里我以網(wǎng)絡(luò)基礎(chǔ)庫(kù)為例子,首先在目標(biāo)文件夾下,執(zhí)行以下命令
創(chuàng)建cocoapods工程
pod lib create EthercapNetworkLibrary
之后,cocoapods會(huì)自動(dòng)下載工程模板,完成后,會(huì)問幾個(gè)關(guān)于配置的問題,語言種類、是否需要測(cè)試demo、測(cè)試框架等

這里我選擇OC作為開發(fā)語言,包含測(cè)試demo,這樣就不用新建一個(gè)測(cè)試工程,節(jié)省一些步驟,全部填寫后,會(huì)自動(dòng)打開cocoapods幫你建立好的模板工程,目錄結(jié)構(gòu)如下

需要注意的是,和平時(shí)開發(fā)有所不同,現(xiàn)在我們的開發(fā)都應(yīng)該在Pod工程下進(jìn)行,在Classes文件夾下添加需要的類,開發(fā)完成后,在demo工程中寫測(cè)試代碼,就可以直接運(yùn)行和測(cè)試了,非常方便,這里就不在贅述。
編寫Spec文件
想要建立私有庫(kù),還有一個(gè)文件非常重要,就是podspec,工程的索引文件,打開文件,刪除掉無用注釋,鍵入以下內(nèi)容
編寫Spec文件
Pod::Spec.newdo|s|
s.name???????? ="EthercapNetworkLibrary"
s.version????? ="0.0.2"
s.summary????? ="EthercapNetworkLibrary."
s.description? = <<-DESC
this is EthercapNetworkLibrary
DESC
s.homepage???? ="http://git.ethercap.com/mobile-componentization/EthercapNetworkLibrary"
s.license????? = {:type=>"MIT",:file=>"FILE_LICENSE"}
s.author???????????? = {"Muqiushi"=>"Muqiushi@ethercap.com"}
s.platform???? =:ios,"8.0"
s.source?????? = {:git=>"http://git.ethercap.com/mobile-componentization/EthercapNetworkLibrary.git",:tag=> s.version.to_s }
s.subspec'AFNetworking'do|network|
network.source_files ="EthercapNetworkLibrary/EthercapNetworkLibrary/AFNetworking/*.{h,m}"
network.public_header_files ="EthercapNetworkLibrary/EthercapNetworkLibrary/AFNetworking/*.h"
network.frameworks ="SystemConfiguration","CoreTelephony"
network.library ="resolv"
network.ios.vendored_frameworks ="EthercapNetworkLibrary/Frameworks/AlicloudHttpDNS.framework","EthercapNetworkLibrary/Frameworks/AlicloudUtils.framework","EthercapNetworkLibrary/Frameworks/UTDID.framework"
end
s.subspec'UIKit+AFNetworking'do|networkui|
networkui.source_files ="EthercapNetworkLibrary/EthercapNetworkLibrary/UIKit+AFNetworking/*.{h,m}"
networkui.public_header_files ="EthercapNetworkLibrary/EthercapNetworkLibrary/UIKit+AFNetworking/*.h"
networkui.dependency"EthercapNetworkLibrary/AFNetworking"
end
end
解釋以下里面的幾個(gè)主要內(nèi)容
name:pod search時(shí)提供給別人的檢索名字
version:工程版本號(hào),一般是和tag相對(duì)應(yīng)
source::git 工程的git地址,:tag工程的標(biāo)簽版本
source_file: 上傳到遠(yuǎn)端的本地文件路徑,在這些路徑下的文件才會(huì)被打包
frameworks: 工程用到的系統(tǒng)framework名字
library:工程用到的系統(tǒng)library,注意,這里需要去掉前面的lib前綴
vendored_frameworks:工程中使用的第三方framework,需要加入路徑
更多屬性可以參照官網(wǎng)教程來寫,Podspec Syntax Reference
上傳到私有Spec Repo
開發(fā)完成并編輯好spec文件后,就可以進(jìn)行上傳,以便讓別人可以通過pod方式引入我們的工程。在上傳之前,首先要檢驗(yàn)本地spec文件的有效性,是否存在錯(cuò)誤和引用依賴是否完備,在工程根目錄下執(zhí)行以下命令
本地檢查Spec文件合法性
pod lib lint
有錯(cuò)誤的話按照提示修改spec文件,成功的話會(huì)提示:
EthercapNetworkLibrary passed validation.
接下來遠(yuǎn)程檢查pods,這次cocoapods會(huì)根據(jù)podspec文件里的source 檢查對(duì)應(yīng)的倉(cāng)庫(kù)里有沒有指定tag的倉(cāng)庫(kù)。顯然我們還沒有將tag上傳到github的倉(cāng)庫(kù)里,可定會(huì)報(bào)錯(cuò),執(zhí)行試一下
遠(yuǎn)程檢查Spec合法性
pod spec lint
-> EthercapNetworkLibrary (0.0.2)
- WARN? | description: The description is shorter than the summary.
- ERROR | [iOS] unknown: Encountered an unknown error ([!] /Applications/Xcode.app/Contents/Developer/usr/bin/git clone http://git.ethercap.com/mobile-componentization/EthercapNetworkLibrary.git /var/folders/6x/8pyfnj_n4573cq4206yjz41c0000gn/T/d20161017-14130-148x77b --template= --single-branch --depth 1 --branch 1.0
Cloning into'/var/folders/6x/8pyfnj_n4573cq4206yjz41c0000gn/T/d20161017-14130-148x77b'...
fatal: Remote branch0.0.2not found in upstream origin
) during validation.
Analyzed1podspec.
[!] The spec did not pass validation, due to1error and1warning.
提示0.0.2沒有找到,所以先把工程上傳,打tag,注意tag名一定要是0.0.2,和spec中相同,具體git操作自行解決。
之后再次執(zhí)行
pod spec lint
提示EthercapNetworkLibrary passed validation.說明檢測(cè)通過
最后執(zhí)行一下命令,將spec文件上傳到spec repo中
pod repo push EthercapPrivateSpec EthercapNetworkLibrary.podspec
上傳成功后,可以在倉(cāng)庫(kù)中看到你的spec文件

至此,我們的工程就可以和AFNetworking一樣,通過pod被別人引用,嘗試執(zhí)行一下pod search EthercapNetworkLibrary

over