iOS組件化(一)-利用CocoaPods拆分項(xiàng)目和私有化

Cocoapods 執(zhí)行流程

其實(shí)利用CocoaPods拆分項(xiàng)目就是根據(jù)業(yè)務(wù)和項(xiàng)目情況,就是把項(xiàng)目分成一個(gè)一個(gè)子項(xiàng)目,然后通過(guò)CocoaPods去將子項(xiàng)目打包成子工程,在主工程里面去引入子工程。

在利用CocoaPods實(shí)現(xiàn)拆分項(xiàng)目,并私有化組件之前先說(shuō)一下CocoaPods 和 遠(yuǎn)程倉(cāng)庫(kù)的關(guān)系


QQ20200514-220501.png

CocoaPods中有一個(gè)Spec Repo的概念,Spec Repo 就是一個(gè)索引庫(kù)。里面有很多podSpec索引,podSpec 是庫(kù)的描述文件,里面記錄著庫(kù)的描述,版本,地址,依賴庫(kù)等信息。注意不要混淆Spec Repo和podSpec的概念

在我們安裝CocoaPods的時(shí)候,會(huì)把遠(yuǎn)程索引庫(kù)master拉到本地,所以我們本地會(huì)有一個(gè)索引庫(kù)master。當(dāng)我們執(zhí)行pod install的時(shí)候會(huì)去索引庫(kù)master查找Podfile文件里面庫(kù)對(duì)應(yīng)的PodSpec,找到后會(huì)根據(jù)PodSpec找到對(duì)應(yīng)的遠(yuǎn)程倉(cāng)庫(kù)。找到遠(yuǎn)程倉(cāng)庫(kù)后會(huì)把代碼clone到本地緩存起來(lái),然后copy到我們的工程中。


利用CocoaPods 生成模塊以及將模塊私有化

利用CocoaPods私有組件其實(shí)就是把遠(yuǎn)程共有索引庫(kù)這一部分去掉


QQ20200524-164335.png

利用CocoaPods 拆分項(xiàng)目并私有化的流程如下

  1. 本地新建一個(gè)索引庫(kù),并上傳到遠(yuǎn)程倉(cāng)庫(kù)上

  2. 利用Cocoapods命令創(chuàng)建子模塊,把業(yè)務(wù)代碼搬到子模塊上,把子模塊上傳到遠(yuǎn)程倉(cāng)庫(kù)取

  3. 驗(yàn)證子模塊是否符合Cocoapods的規(guī)范,如果符合,則推送到索引庫(kù)

接下來(lái)一步一步去說(shuō)明

1. 本地新建一個(gè)索引庫(kù),并上傳到遠(yuǎn)程倉(cāng)庫(kù)上

首先上git新建一個(gè)索引庫(kù)


QQ20200514-232541.png

注意上圖中紅色箭頭所指向的地方要勾選上,不然后面推送索引庫(kù)有可能報(bào)以下錯(cuò)誤

Your configuration specifies to merge with the ref 'refs/heads/master'
from the remote, but no such ref was fetched.

克隆到本地后執(zhí)行 pod repo add[索引庫(kù)名稱][索引庫(kù)地址],如下


pod repo add SFRepoCenter https://github.com/samstring/SFRepoCenter.git

這時(shí)候 進(jìn)入 ~/.cocoapods/repos 中就可以看到與遠(yuǎn)程倉(cāng)庫(kù)關(guān)聯(lián)的本地索引庫(kù)


QQ20200514-233759.png

這時(shí)候一個(gè)私有的索引庫(kù)就創(chuàng)建完畢

2 利用Cocoapods命令創(chuàng)建子模塊,把業(yè)務(wù)代碼搬到子項(xiàng)目上,把子項(xiàng)目上傳到遠(yuǎn)程倉(cāng)庫(kù)取

在GitHub上新建一個(gè)子模塊SFCommonKit

利用Cocoapods官方命令 pod lib create [模塊名稱] 創(chuàng)建子模塊


pod lib create SFCommonKit

這時(shí)候會(huì)問(wèn)你幾個(gè)問(wèn)題


1.What platformdoyou want to use?[iOS/macOS] //將模塊應(yīng)用到什么平臺(tái)上

2.What languagedoyou want to use?[Swift/ObjC] // 模塊的開發(fā)語(yǔ)言

3.Would you like to include a demo applicationwithyour library?[Yes/No] //是否生成demo應(yīng)用,這里建議生成,因?yàn)槟憧梢栽谶@里進(jìn)行測(cè)試

4.Which testing frameworks will you use?[Specta/Kiwi/None] //是否集成測(cè)試框架

5.Would you like todo view based testing?[Yes/No]

6.What is your class prefix?  //開發(fā)前綴

執(zhí)行完畢會(huì)生成以下文件


QQ20200514-235817.png

源文件里面的文件結(jié)構(gòu)是這樣的


QQ20200515-000802.png

這時(shí)候把我們講子模塊的類放到Classes文件夾,在Example工程里面pod install后就可以進(jìn)行開發(fā)測(cè)試了,另外注意一下pod install后的導(dǎo)入Example里面的pod會(huì)放在Development Pods這個(gè)目錄如下
QQ20200515-001124.png

開發(fā)完成后,我們需要查看SFCommonKit.podspec這個(gè)文件了,文件內(nèi)容如下

#
# Be sure to run `pod lib lint SFCommonKit.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
  s.name            = 'SFCommonKit'
  s.version          = '0.1.1'
  s.summary          = 'A short description of SFCommonKit.'
# This description is used to generate tags and improve search results.
#  * Think: What does it do? Why did you write it? What is the focus?
#  * Try to keep it short, snappy and to the point.
#  * Write the description between the DESC delimiters below.
#  * Finally, don't worry about the indent, CocoaPods strips it!
  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC
  s.homepage        = 'https://github.com/samstring/SFCommonKit'
  # s.screenshots    = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author          = { 'samstring' => '1264986115@qq.com' }
  s.source          = { :git => 'https://github.com/samstring/SFCommonKit.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/'
  s.ios.deployment_target = '8.0'
  s.source_files = 'SFCommonKit/Classes/**/*'

  # s.resource_bundles = {
  #  'SFCommonKit' => ['SFCommonKit/Assets/*.png']
  # }
  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
   s.dependency 'AFNetworking', '~> 2.3'
end

其中,下面幾個(gè)內(nèi)容需要注意的

s.name  模塊名稱,將來(lái)pod install的名稱是依據(jù)這個(gè)來(lái)的
s.version 模塊版本,將來(lái)pod install的版本是依據(jù)這個(gè)來(lái)的
s.homepage 模塊的主頁(yè)
s.source 模塊的遠(yuǎn)程倉(cāng)庫(kù)地址
s.frameworks 引用的系統(tǒng)庫(kù),如果用了靜態(tài)庫(kù) ,驗(yàn)證的時(shí)候需要加--use-libraries
s.dependency 引用的第三方,如有多個(gè),可以重復(fù)聲明

檢查完podspec確認(rèn)無(wú)誤后就可以就可以上傳到遠(yuǎn)程倉(cāng)庫(kù)上了

git add .
git commit -m "初始化"
git remote add origin [遠(yuǎn)程倉(cāng)庫(kù)地址]
git push --set-upstream origin master

上傳成功后需要加tag標(biāo)志,注意一下這個(gè)tag標(biāo)志需要與上面說(shuō)到的s.version里面的版本號(hào)保持一致

git tag 0.1.0
git push --tags

3. 驗(yàn)證子模塊是否符合Cocoapods的規(guī)范,如果符合,則推送到索引庫(kù)

上傳到成功后,我們就可以使用CocoaPods命令 pod lib lint 驗(yàn)證這個(gè)工程是否符合

pod lib lint SFCommonKit.podspec --allow-warnings

如果有依賴的靜態(tài)庫(kù)需要添加 --use-libraries

pod lib lint --use-libraries --allow-warnings

如果有依賴的其他私有庫(kù),需要加上--sources,如下

pod lib lint --sources='https://github.com/samstring/SFRepoCenter.git,https://github.com/CocoaPods/Specs.git' --allow-warnings 

其中sources='https://github.com/samstring/SFRepoCenter.git,https://github.com/CocoaPods/Specs.git'中有兩個(gè)值,一個(gè)是CocoaPods的索引庫(kù),一個(gè)是引用的私有庫(kù)所在的私有化的索引庫(kù)。

如果有依賴的私有庫(kù),sources里面需要加上索引庫(kù)的倉(cāng)庫(kù)地址,這里是https://github.com/samstring/SFRepoCenter.git。

如果你的庫(kù)不是私有庫(kù),是發(fā)布到了Cocopods的trunk(可以供所有人下載),或是你的這個(gè)私有庫(kù)里面包含了一些像AFNetworking的第三方,sources里面需要添加https://github.com/CocoaPods/Specs.git

其實(shí),上面驗(yàn)證這一步可以不做,可以直接向Spec Repo提交podspec的命令pod repo push [索引庫(kù)] [庫(kù)配置文件] --allow-warnings,因?yàn)檫@樣做的話會(huì)自動(dòng)幫我們?nèi)ヲ?yàn)證是否合法

pod repo push SFRepoCenter SFCommonKit.podspec --allow-warnings

到此,CocoaPods私有化已經(jīng)完成,通過(guò)pod search SFCommonKit就可以搜索到我們剛才提交的私有庫(kù)了


怎樣使用剛才所生成的私有庫(kù)

如果要在外部工程中使用剛才的私有庫(kù),需要指定索引庫(kù),否則只會(huì)默認(rèn)在Cocopods 的master索引庫(kù)去找,但是由于是私有庫(kù),所以會(huì)找不到我們所以庫(kù)。那怎么制定所以庫(kù)呢?其實(shí)只需要在Podfile中加入索引庫(kù)即可,例子如下

use_frameworks!
platform :ios, '9.0'
source 'https://github.com/samstring/SFRepoCenter.git'
source'https://github.com/CocoaPods/Specs.git'
target 'SFMainProject' do
pod 'SFCommonKit'
pod 'SFUserModule'
end

注意,添加私有庫(kù)索引的時(shí)候最好把master索引庫(kù)也加上,否則會(huì)找不到master索引庫(kù)里面的工程,如后期需要加入AFNetworking等第三方的時(shí)候會(huì)報(bào)找不到庫(kù)的錯(cuò)誤。

最后編輯于
?著作權(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ù)。

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