背景
為了提高項(xiàng)目編譯速度犀忱,對(duì)于大量使用組件化開(kāi)發(fā)的項(xiàng)目組而言,組件二進(jìn)制化是必然要走的路線争舞,中心思想就是要將各個(gè)組件打包成二進(jìn)制庫(kù)女责。
目前的方案
- 分倉(cāng)庫(kù)管理
- Carthage管理
- podspec環(huán)境變量
- podspec分tag管理
- podspec分subspecs管理
分倉(cāng)庫(kù)管理
:創(chuàng)建了一個(gè)公用SDK倉(cāng)庫(kù),專(zhuān)門(mén)放生成的Framework湿蛔,spec文件內(nèi)使用subspecs區(qū)分各個(gè)Framework膀曾。公用倉(cāng)庫(kù)和源碼倉(cāng)庫(kù)切換。
缺點(diǎn):
1.需要額外維護(hù)一個(gè)公用SDK倉(cāng)庫(kù)
2.維護(hù)2個(gè)spec煌集,源碼倉(cāng)庫(kù)也需要升級(jí)
3.每次功能改動(dòng)妓肢,需要打包并提交到公用SDK倉(cāng)庫(kù)
Carthage
:Carthage是一款去中心化的依賴(lài)管理器捌省,只需要工程配置好苫纤,即可編譯.
podspec環(huán)境變量
: 利用podspec內(nèi)支持if、else語(yǔ)法特點(diǎn)纲缓。 通過(guò)pod install的時(shí)候傳入?yún)?shù)卷拘, podspec判斷參數(shù)配置編譯。
if ENV['IS_SOURCE']
s.source_files = [
'ABC/*.{h,m}',
'ABC/**/*.{h,m}'
]
else
s.source_files = 'SDK/**/*.{h}'
s.ios.vendored_frameworks = 'SDK/*.framework'
end
IS_SOURCE=1 pod install
缺點(diǎn):
1.需要清除私有庫(kù)的緩存
2.需要手動(dòng)刪除/Pods/XXX
3.不能針對(duì)單獨(dú)庫(kù)進(jìn)行切換祝高,除非自定義白名單之類(lèi)的規(guī)則
podspec分tag管理
:
庫(kù)與源碼同一套代碼管理
- example添加一個(gè)生成庫(kù)的Target
- 通過(guò)prepare_command編譯Target輸出對(duì)應(yīng)庫(kù)
- podspec中通過(guò)s.version判斷當(dāng)前使用的哪個(gè)版本栗弟, 判斷是否通過(guò)prepare_command輸出庫(kù) 或者 使用源代碼。(這樣同一個(gè)版本就需要上傳2個(gè)tag)工闺。
分tag管理解決了下面3個(gè)問(wèn)題:
1.可以不要將靜態(tài)庫(kù)上傳到git(如果包體積很大會(huì)很占用git空間)
2.一套代碼同時(shí)管理源碼和二進(jìn)制
3.在源碼及二進(jìn)制間切換.
但是同時(shí)也有一個(gè)最大的缺點(diǎn):私有庫(kù)的tag需要打兩個(gè)乍赫,podspec上傳時(shí)需要傳兩次
該方法具體實(shí)施可以參考:https://juejin.cn/post/6844904202813046797
podspec分subspecs管理
: 主要就是podspec里面增加subspecs配置,然后項(xiàng)目中根據(jù)subspecs選項(xiàng)使用對(duì)應(yīng)的配置, 這樣就解決了要上傳2次podspec的問(wèn)題陆蟆。
s.prepare_command = '/bin/bash ./build_freamwork.sh'
s.subspec 'Framework' do |sf|
sf.vendored_framework = 'Pod/Products/*.framework'
sf.pod_target_xcconfig = {
'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64'
}
sf.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
end
s.subspec 'Core' do |sc|
sc.source_files = 'ABC/Classes/**/*'
end
pod 'ABC', :git => "git@github.com:srs888001/BinaryLib.git", :tag => '0.1.5', :subspecs => ['Core']
使用Swift時(shí)候的注意點(diǎn):
Error: Unknown class _SomeModuleSomeCell in Interface Builder file:
這是由于組件中的 Xib 有對(duì)應(yīng)的 class, xib 加載后會(huì)去將 outlet 賦值到對(duì)應(yīng)類(lèi)實(shí)例, 而類(lèi)和 xib 不在同一 bundle 內(nèi)造成錯(cuò)誤. 所以需要在 xib 的 Identity Inspector->Custom Class->Module 指定類(lèi)所屬模塊.Error: 'ASwiftFrameworkClass' is unavailable: cannot find Swift declaration for this class
對(duì) Swift framework 進(jìn)行多 architecture 合并時(shí), 除了 exec 可執(zhí)行文件外, 還需要將 .framework/Modules 文件夾內(nèi)的描述文件一并合并, 否則編譯時(shí)會(huì)提示錯(cuò)誤.Error: Module 'XXXX' not found
在 Objective-C 源項(xiàng)目中導(dǎo)入 Swift framework 后, 會(huì)出現(xiàn)此錯(cuò)誤, 需要在 Objective-C Target -> Build Settings 中, 設(shè)置alwaysEmbedSwiftStandardLibraries = YES在Pod trunk push的時(shí)候出現(xiàn)arm64的錯(cuò)誤
原因是Apple Silicon需要再模擬器使用arm64雷厂,處理方法
參考:
1.https://imfong.com/post/Talk-iOS-Library-Binary-Practice
2.https://juejin.cn/post/6844904202813046797
3.https://blog.csdn.net/weixin_33989780/article/details/88216815
4.https://juejin.cn/post/6844903589656133640