CocoaPods 私有庫(kù)組件管理小結(jié)

小白初學(xué)CocoaPods組件管理,做一個(gè)階段小結(jié),有些術(shù)語(yǔ)描述不當(dāng),不吝指正!
私有庫(kù)組件管理核心思路:

  • 私有庫(kù)搭建
  • 私有庫(kù)添加podspec

前言

CocoaPods通過(guò)什么管理組件?當(dāng)然是通過(guò)NAME.podspec文件,只要NAME.podspec 文件是有效的,都可以加入CocoaPods Spec Repo(Repository)中。

  1. CocoaPods Spec Repo
    故名思義就是CocoaPods存放管理NAME.podspec的倉(cāng)庫(kù),ConcoPods官方提供的Spec Repo 本地倉(cāng)庫(kù)為~/.cocoapods/repos目錄下的trunk,安裝CocoaPods的時(shí)候,會(huì)默認(rèn)添加。

注:CocoaPods 1.7.2后為trunk,之前為master,其實(shí)大同小異。

pod repo list

可以查看~/.cocoapods/repos目錄下的所有Spec Repo,結(jié)果如下圖所示。



因?yàn)槲业碾娔X沒(méi)有添加其它Spec Repo,所以只有1條記錄,其中trunk為ConcoPods官方管理的Spec Repo本地倉(cāng)庫(kù)。URL對(duì)應(yīng)的是Spec Repo遠(yuǎn)程倉(cāng)庫(kù)地址。

  1. 驗(yàn)證NAME.podspec的有效性
    NAME.podspec的有效性需要滿足podspec的基本語(yǔ)法規(guī)范,本文不做詳細(xì)說(shuō)明官方鏈接,并且通過(guò)以下兩條指令的驗(yàn)證。
pod spec lint [NAME.podspec|DIRECTORY|http://PATH/NAME.podspec ...]
pod lib lint [PODSPEC_PATHS ...]

兩個(gè)命令如果省略 lint 后面內(nèi)容,會(huì)自動(dòng)驗(yàn)證當(dāng)前目錄下的NAME.podspec。
CocoaPods官方對(duì)兩條指令的說(shuō)明:
The difference between them is that pod lib lint does not access the network, whereas pod spec lint checks the external repo and associated tag.

私有庫(kù)搭建流程

搭建私有庫(kù),核心流程有以下兩點(diǎn):

  • 創(chuàng)建Spec Repo遠(yuǎn)程倉(cāng)庫(kù),用以管理NAME.podspec;
  • Spec Repo遠(yuǎn)程倉(cāng)庫(kù)和本地關(guān)聯(lián)。

所謂私有庫(kù),就是搭建一個(gè)和trunk類似的自己使用的Spec Repo倉(cāng)庫(kù),需要自己維護(hù)管理podspec文件。個(gè)人理解,這里的“私有”和Spec Repo遠(yuǎn)程倉(cāng)庫(kù)的公開(kāi)或私有沒(méi)有任何關(guān)系,Spec Repo遠(yuǎn)程倉(cāng)庫(kù)是私用或者公開(kāi)取決于自己。不過(guò)公開(kāi)好像意義也不大,因?yàn)楣俜接泄_(kāi)的Spec Repo倉(cāng)庫(kù),把自己想公開(kāi)的podspec加到這里即可。

創(chuàng)建Spec Repo遠(yuǎn)程倉(cāng)庫(kù)

GitHub 2019年后免費(fèi)開(kāi)放了私有倉(cāng)庫(kù)的創(chuàng)建,因此本文使用GitHub 創(chuàng)建Spec Repo遠(yuǎn)程私有倉(cāng)庫(kù),創(chuàng)建的過(guò)程網(wǎng)上有很多資料,不細(xì)說(shuō)。創(chuàng)建完成后會(huì)得到倉(cāng)庫(kù)的遠(yuǎn)程地址,本文的Spec Repo遠(yuǎn)程倉(cāng)庫(kù)地址為:

https://github.com/laiTree/MySpecRepo.git
Spec Repo遠(yuǎn)程倉(cāng)庫(kù)和本地關(guān)聯(lián)

把Spec Repo遠(yuǎn)程倉(cāng)庫(kù)關(guān)聯(lián)到本地可以通過(guò)下面指令進(jìn)行:

pod repo add SpecRepoName GitURL [BRANCH]

SpecRepoName為Spec Repo遠(yuǎn)程倉(cāng)庫(kù)本地名字,GitURL為Spec Repo遠(yuǎn)程倉(cāng)庫(kù)地址。把剛才創(chuàng)建的Spec Repo遠(yuǎn)程倉(cāng)庫(kù)關(guān)聯(lián)到本地:

pod repo add MySpecRepo https://github.com/laiTree/MySpecRepo.git

完成后通過(guò)pod repo list命令查看:



可以看到在本地生成了MySpecRepo倉(cāng)庫(kù)。

私有庫(kù)添加podspec

用自己創(chuàng)建的私有庫(kù)添加podspec有以下幾個(gè)關(guān)鍵點(diǎn):

  • 如何獲得podspec;
  • 如何驗(yàn)證podspec;
  • 如何把podspec添加到私有庫(kù)。
如何獲得podspec

獲得podspec的方式個(gè)人總結(jié)有3個(gè):

  1. 第三方開(kāi)源庫(kù)的podspec,比如Masonry;
  2. 通過(guò)pod spec create SpecName;
  3. 通過(guò)pod lib create PodName。

第一種方式,podspec已經(jīng)完全寫(xiě)好了,不過(guò)不能管理自己的代碼。
第二種方式,podspec官方模版樣式,完全需要自己填寫(xiě),可謂是一窮二白。
第三種方式,生成了Pod工程,包括了簡(jiǎn)陋的podspec,基本足夠測(cè)試使用。


注:Pod個(gè)人理解就是所謂的組件吧,podspec只是管理Pod的工具,描述了Pod的基本信息、依賴、代碼文件組織方式等等內(nèi)容

官方也推薦使用第三種方式,通過(guò)下面指令創(chuàng)建Pod:

pod lib create MakeApple(Pod工程名字,也是podspec的名字)

執(zhí)行上面命令,會(huì)出現(xiàn)下面回答問(wèn)題界面:


按需回答問(wèn)題后,即創(chuàng)建了MakeApple Pod工程,默認(rèn)自動(dòng)由Xcode打開(kāi),工程目錄如下所示:


本地目錄結(jié)構(gòu)為:



Example為Pod工程測(cè)試代碼存放位置,MakeApple為Pod 代碼存放位置,為了簡(jiǎn)單本文什么也不添加,podspec默認(rèn)的內(nèi)容為:

Pod::Spec.new do |s|
  s.name             = 'MakeApple'
  s.version          = '0.1.0'
  s.summary          = 'A short description of MakeApple.'
  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'https://github.com/laiTree/MakeApple'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'example' => 'example@163.com' }
  s.source           = { :git => 'https://github.com/laiTree/MakeApple.git', :tag => s.version.to_s }

  s.ios.deployment_target = '8.0'
  s.source_files = 'MakeApple/Classes/**/*'
end

注:s.author 脫敏處理了,??

如何驗(yàn)證podspec

在Pod工程podspec 所在目錄執(zhí)行指令

pod lib lint

結(jié)果如下所示:



NOTE不需關(guān)注,只是和Xcode相關(guān),還有2個(gè)WARN。
執(zhí)行指令

pod spec lint

結(jié)果如下所示:



有2個(gè)WARN,和pod lib lint一樣,還有1個(gè)ERROR,這也說(shuō)明了兩條指令的區(qū)別。
為了保證podspec添加到私有庫(kù)成功,必須保證沒(méi)有ERROR,盡量減少WARN。執(zhí)行上面任意一條指令都可以,不過(guò)都需要解決下面問(wèn)題。
上面驗(yàn)證存在兩個(gè)共性問(wèn)題:

  • s.summary沒(méi)有意義
  • s.homepage不可達(dá)

pod spec lint ERROR為遠(yuǎn)程倉(cāng)庫(kù)不存在。


注:此處的遠(yuǎn)程倉(cāng)庫(kù)為代碼倉(cāng)庫(kù),即存放Pod代碼,和前面Spec Repo遠(yuǎn)程倉(cāng)庫(kù)不是同一個(gè)哦。來(lái)硬的讓它們?yōu)橥粋€(gè)也沒(méi)人阻止你,不過(guò)沒(méi)有任何意義,??

創(chuàng)建遠(yuǎn)程代碼倉(cāng)庫(kù)和創(chuàng)建Spec Repo遠(yuǎn)程倉(cāng)庫(kù)一樣,借助GitHub就能完成,不過(guò)倉(cāng)庫(kù)最好什么內(nèi)容也不加,因?yàn)?strong>LICENSE,README.gitignore等pod lib create默認(rèn)就創(chuàng)建了,pod lib create就是這么的好用。創(chuàng)建好代碼遠(yuǎn)程倉(cāng)庫(kù)后,拿到代碼遠(yuǎn)程倉(cāng)庫(kù)的地址,本文的地址為:

https://github.com/laiTree/MakeApple.git

萬(wàn)事具備,解決podspec存在的問(wèn)題:

s.summary          = '我修改好了.'
s.homepage         = 'https://github.com/laiTree/MakeApple'
s.source           = { :git => 'https://github.com/laiTree/MakeApple.git', :tag => s.version.to_s }

把Pod工程代碼上傳到代碼遠(yuǎn)程倉(cāng)庫(kù),并且打上和s.version一致的tag,不熟悉的話,該溫習(xí)git的指令了,這里不做詳細(xì)說(shuō)明。
重新驗(yàn)證podspec,pod lib lint和pod spec lint的驗(yàn)證結(jié)果一致,如下所示:


可以看到綠色文字,說(shuō)明podspec通過(guò)了驗(yàn)證。

把podspec添加到私有庫(kù)

在Pod工程podspec所在目錄,通過(guò)下面指令,把podspec添加到Spec Repo私有庫(kù)中:

pod repo push SpecRepoName [NAME.podspec]

SpecRepoName為Spec Repo私有庫(kù)名字,NAME.podspec為驗(yàn)證通過(guò)的podspec,把本文通過(guò)驗(yàn)證的podspec添加到自己的MySpecRepo私有庫(kù)中:

pod repo push MySpecRepo MakeApple.podspec

執(zhí)行指令過(guò)程如下所示:


pod repo push指令的執(zhí)行過(guò)程為:

  • 驗(yàn)證podspec;
  • 更新本地MySpecRepo私有庫(kù),即把podspec添加到本地MySpecRepo;
  • 把本地MySpecRepo上傳到MySpecRepo遠(yuǎn)程倉(cāng)庫(kù)。

查看~/.cocoapods/repos/MySpecRepo如下所示:


MakeApple目錄結(jié)構(gòu)為:MakeApple/0.1.0/MakeApple.podspec
查看MySpecRepo遠(yuǎn)程倉(cāng)庫(kù),如下所示:


由此可以確定,MakeApple.podspec成功添加到MySpecRepo私有庫(kù)中。


注:私有Spec Repo不僅可以添加自己Pod的NAME.podspec,同時(shí)也可以添加第三方Pod的NAME.podspec,如Masonry。這對(duì)限制訪問(wèn)外網(wǎng),構(gòu)建私有的Spec Repo是有必要的。

使用自己的Pod

新建Xcode工程,創(chuàng)建Podfile文件,在Podfile中添加自己的Pod,如下所示:

#根據(jù)實(shí)際設(shè)置
platform :ios, '9.0'
#私有庫(kù)遠(yuǎn)程倉(cāng)庫(kù)地址
source 'https://github.com/laiTree/MySpecRepo.git' 

target 'TestMakeApple' do
  use_frameworks!

  pod 'MakeApple', '~>0.1.0'

end

然后執(zhí)行:

pod install

重新打開(kāi)工程,如下所示:


說(shuō)明MakeApple成功添加到新工程的依賴中。


注:如果使用了CocoaPods 管理的第三方Pod,需要添加CocoaPods官方Spec Repo遠(yuǎn)程倉(cāng)庫(kù)地址

source 'https://cdn.cocoapods.org/'

刪除私有庫(kù)

pod repo remove SpecRepoName

別人使用你的私有庫(kù)

把Spec Repo遠(yuǎn)程倉(cāng)庫(kù)關(guān)聯(lián)到他電腦本地:

pod repo add SpecRepoName GitURL [BRANCH]

如果Spec Repo遠(yuǎn)程倉(cāng)庫(kù)為私有,需要輸入用戶名,密碼。


注:如果不關(guān)聯(lián)到本地其實(shí)也可以正常使用,只需要Podfile中 source 引用Spec Repo 遠(yuǎn)程倉(cāng)庫(kù)地址,這樣會(huì)自動(dòng)把Spec Repo關(guān)聯(lián)到本地,缺點(diǎn)就是不能決定本地Spec Repo的名字

私有庫(kù)原理解析

Spec Repo維護(hù)了Pod NAME.podspec信息,NAME.podspec中的s.source指定了Pod代碼遠(yuǎn)程倉(cāng)庫(kù)的地址,同時(shí)NAME.podspec還描述了Pod 的基本信息、依賴、代碼文件組織方式(文件層級(jí)結(jié)構(gòu))等內(nèi)容。

Podfile 使用Pod時(shí)
加入source ‘SpecRepoGitURL’,即Spec Repo遠(yuǎn)程倉(cāng)庫(kù)地址
pod ‘NAME’ 會(huì)到Spec Repo遠(yuǎn)程倉(cāng)庫(kù)中查找對(duì)應(yīng)Pod 的NAME.podspec信息,由此找到Pod代碼倉(cāng)庫(kù)的地址,加入工程。NAME.podspec描述的Pod 源碼組織方式?jīng)Q定了Pod在Xcode中源碼展開(kāi)方式。

參考鏈接

CocoaPods Guides
Creating Your First CocoaPod
Xcode project中引入Cocoapods管理
CocoaPods 私有倉(cāng)庫(kù)的創(chuàng)建(超詳細(xì))
制作自己的cocoapods
教你如何從0到1實(shí)現(xiàn)組件化架構(gòu)
Cocoapods使用私有庫(kù)中遇到的坑
Cocoapods 應(yīng)用第二部分-私有庫(kù)相關(guān)
使用Cocoapods創(chuàng)建私有podspec


注:第一次寫(xiě)博客,寫(xiě)的不好,如果覺(jué)得對(duì)你有所幫助,不妨點(diǎn)個(gè)贊!哈哈哈。。。

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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