序言
經(jīng)過長時間的使用實(shí)踐拜轨,發(fā)現(xiàn)靜態(tài)包使用率不高,所以這個解決方案現(xiàn)已棄用胯甩。
介紹
考慮到代碼編譯時間,我在構(gòu)建組件化過程中引入了靜態(tài)包方案木柬,即每一個Pod庫都支持源碼和靜態(tài)包兩種安裝方式。
這不但需要修改*.podspec
文件來支持恶复,還須要在每次發(fā)布前編譯靜態(tài)包谤牡。
開發(fā)過程變得比較繁瑣姥宝,為了方便開發(fā)腊满,我對官方模版做了一點(diǎn)優(yōu)化培己,發(fā)布了Pod-Template省咨,還寫了一個命令行工具 Pod-Pipeline 來簡化發(fā)布操作零蓉。
Pod-Template介紹
- 結(jié)構(gòu)改動
- 由于我暫時沒有進(jìn)行swift為主的Pod庫開發(fā)敌蜂。所以我刪掉了模版中的swift內(nèi)容绅项。
- 由于我希望Pod庫支持靜態(tài)包。所以我移除了Podfile中的
use_frameworks!
- 由于Pod內(nèi)容和編譯內(nèi)容較多囊陡,且不是必要保存內(nèi)容撞反。所以在
.gitignore
文件中添加了Pods/
和${POD_NAME}-*/
兩個默認(rèn)忽略項(xiàng)遏片。- 由于靜態(tài)包的二進(jìn)制文件無法被Git識別內(nèi)容變化吮便,每次都直接上傳的話會讓Git倉庫變得很大。所以我引入了Git LFS(Large File Storage)髓需,并在項(xiàng)目中添加了
.gitattributes
文件僚匆。但是須要使用者自己在設(shè)備中安裝Git LFS搭幻,并在項(xiàng)目中執(zhí)行git lfs install
檀蹋。
- 通用Pod庫的
*.podspec
中關(guān)于資源、代碼引用的改動
我們在執(zhí)行
pod install
的時候攻臀,實(shí)際是從本地的pod cache
中尋找對應(yīng)的庫進(jìn)行安裝,所以在Spec
中必須同時包含源碼版本和靜態(tài)包版本堡赔。
我選擇使用subspec:SourceMode
和subspec:FrameworkMode
來承載兩種版本的內(nèi)容善已,并由subspec:Core
解析執(zhí)行pod install
時傳入的FX=all(或dependency)
參數(shù)换团,判斷安裝時應(yīng)該使用哪種版本宫蛆。
Pod::Spec.new do |s|
...
#靜態(tài)包模式
s.subspec 'FrameworkMode' do |fm|
fm.vendored_frameworks = '${POD_NAME}/${POD_NAME}SDK/*.framework'
# fm.resource = '${POD_NAME}/${POD_NAME}SDK/*.bundle'
end
#源碼模式
s.subspec 'SourceMode' do |sm|
sm.source_files = [
'${POD_NAME}/Classes/**/*'
]
sm.public_header_files = [
'${POD_NAME}/Classes/**/*.h'
]
# sm.resource_bundles = {
# '${POD_NAME}' => ['${POD_NAME}/Assets/**/*.png']
# }
end
#核心代碼
s.subspec 'Core' do |core|
# FX=all pod install; 所有庫都使用framework模式安裝
isAllFX = ENV['FX'] == "all" || ENV['${POD_NAME}_FX'] == "all";
# FX=dependency pod install; 依賴庫使用framework模式安裝
isDependencyFX = ENV['FX'] == "dependency" || ENV['${POD_NAME}_FX'] == "dependency";
isDependency = !!__FILE__[".cocoapods/repos"];
if isAllFX || (isDependency && isDependencyFX)
core.dependency '${POD_NAME}/FrameworkMode'
else
core.dependency '${POD_NAME}/SourceMode'
end
# core.public_header_files = 'Pod/Classes/**/*.h'
# core.frameworks = 'UIKit', 'MapKit'
# core.dependency 'AFNetworking', '~> 2.3'
# core.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-ObjC' }
end
s.default_subspec = 'Core'
end
- 業(yè)務(wù)組件Pod庫的
*.podspec
中關(guān)于資源想虎、代碼引用的改動
由于業(yè)務(wù)組件之間可能會互相調(diào)用
對外接口
舌厨,而并不需要引用完整Pod庫裙椭。
所以我把對外接口
的聲明文件(即TKModule+*.h
文件)單獨(dú)封裝為subspec:Interface
署浩。
而對外接口
的實(shí)現(xiàn)內(nèi)容(即TKModule+*.m
文件)依然要添加到subspec:SourceMode
筋栋。
此外二汛,使用者可能并未在本地聲明本業(yè)務(wù)組件的對外接口
肴颊,所以安裝源碼版本時應(yīng)該同時安裝subspec:Interface
婿着。
至于靜態(tài)包版竟宋,它本就是由源碼版本編譯得來的,所以其中已經(jīng)包含了對外接口
的聲明文件徒欣。
Pod::Spec.new do |s|
...
#源碼模式
s.subspec 'SourceMode' do |sm|
sm.source_files = [
'${POD_NAME}/Classes/**/*',
'${POD_NAME}/Interface/**/*.m'
]
...
end
#對外接口
s.subspec 'Interface' do |interface|
interface.source_files = [
'${POD_NAME}/Interface/**/*.h',
]
interface.public_header_files = [
'${POD_NAME}/Interface/**/*.h'
]
end
#核心代碼
s.subspec 'Core' do |core|
...
if isAllFX || (isDependency && isDependencyFX)
core.dependency '${POD_NAME}/FrameworkMode'
else
core.dependency '${POD_NAME}/SourceMode'
core.dependency '${POD_NAME}/Interface'
end
...
end
s.default_subspec = 'Core'
end
- 為剛創(chuàng)建的Pod庫添加本地配置
通過我的模版創(chuàng)建的Pod庫打肝,在進(jìn)行開發(fā)前須要添加一些本地配置粗梭。當(dāng)然也可以使用自己的模版去避免了這些手動操作断医。
- 添加Git倉庫的遠(yuǎn)程映射
$ git@github.com:xxx/xxx.git
- 為Git倉庫安裝Git LFS
$ git lfs install
- 修改podspec中的本地配置
Pod::Spec.new do |s| s.summary = 'XXX' s.description = 'XXXX' s.homepage = 'https://github.com/xxx/xxx' s.source = { :git => 'https://github.com/xxx/xxx.git', :tag => s.version.to_s }
- 在Podfile中添加私有的Specs地址
source 'https://github.com/xxxx/Specs.git'
Pod-Pipeline介紹
該工具整合了Git和CocoaPods的一些功能奏纪,可以幫助我更簡單地構(gòu)建和發(fā)布項(xiàng)目亥贸。
#安裝
$ gem install pod-pipeline
Pod-Pipeline和CocoaPods都是基于CLAide(Comand Line aide)實(shí)現(xiàn)命令行功能的,所以基本用法是一致的荣挨,很容易上手默垄。
$ ppl --help
Usage:
$ ppl COMMAND
Pod-Pipeline 是 CocoaPods 的流水線工具.
Commands:
+ build 項(xiàng)目構(gòu)建
+ new 創(chuàng)建新項(xiàng)目
+ publish 項(xiàng)目發(fā)布
+ scan 項(xiàng)目掃描
+ update 項(xiàng)目更新
Options:
--help 展示改命令的介紹面板
通常用法:
- 是在完成需求開發(fā)并提交修改后口锭。
- 在Demo目錄執(zhí)行
pod install
鹃操,保證Demo對Pod庫源碼引用正常荆隘。- 在Pod目錄執(zhí)行下方命令
$ ppl publish\ --repo=xxx\ --build-arch=arm64,armv7\ --build-combine=local\ --update-channel=version,git\ --repo-push-sources=https://github.com/xxxx/Specs.git\ --repo-push-allow-warnings
第2步中生成的
Podfile.lock
改動椰拒,會在ppl update git
命令執(zhí)行過程中和*.podspec
的改動一同提交