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)系

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ù)這一部分去掉

利用CocoaPods 拆分項(xiàng)目并私有化的流程如下
本地新建一個(gè)索引庫(kù),并上傳到遠(yuǎn)程倉(cāng)庫(kù)上
利用Cocoapods命令創(chuàng)建子模塊,把業(yè)務(wù)代碼搬到子模塊上,把子模塊上傳到遠(yuǎn)程倉(cāng)庫(kù)取
驗(yàn)證子模塊是否符合Cocoapods的規(guī)范,如果符合,則推送到索引庫(kù)
接下來(lái)一步一步去說(shuō)明
1. 本地新建一個(gè)索引庫(kù),并上傳到遠(yuǎn)程倉(cāng)庫(kù)上
首先上git新建一個(gè)索引庫(kù)

注意上圖中紅色箭頭所指向的地方要勾選上,不然后面推送索引庫(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ù)

這時(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ì)生成以下文件

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

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

開發(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ò)誤。