組件化

年前調(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容