http://www.itdecent.cn/p/a8ed2f34df0c
對(duì)于大量使用組件化開發(fā)的項(xiàng)目,將各個(gè)組件打包成二進(jìn)制庫可以有效提高項(xiàng)目編譯速度,目前有以下方案:
1)分倉庫管理
2)Carthage管理
3)podspec環(huán)境變量
4)podspec分tag管理
5)podspec分subspecs管理
1. 分倉庫管理
創(chuàng)建了一個(gè)公用SDK倉庫,專門放生成的Framework,spec文件內(nèi)使用subspecs區(qū)分各個(gè)Framework。公用倉庫和源碼倉庫切換。
缺點(diǎn):需要額外維護(hù)一個(gè)公用SDK倉庫;維護(hù)2個(gè)spec,源碼倉庫也需要升級(jí);每次功能改動(dòng),需要打包并提交到公用SDK倉庫。
2. Carthage
Carthage是一款去中心化的依賴管理器,只需要工程配置好,即可編譯。
缺點(diǎn): 支持的 Carthage 安裝的第三方框架和依賴不如 CocoaPods 豐富;無法在 Xcode 里定位到源碼;安裝包的大小比用CocoaPods安裝的包大。
3. podspec環(huán)境變量
利用podspec內(nèi)支持if、else語法特點(diǎn),在pod install的時(shí)在其前面設(shè)置傳入?yún)?shù), podspec走相關(guān)判斷判斷分支來配置資源拉去。
//// podspec內(nèi)支持if、else語法
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
//// 執(zhí)行pod install
IS_SOURCE=1 pod install
缺點(diǎn):每次都需要清除私有庫的緩存;需要手動(dòng)刪除/Pods/XXX;不能針對(duì)單獨(dú)庫進(jìn)行切換,除非自定義白名單之類的規(guī)則;
4. podspec分tag管理
二進(jìn)制庫與源碼可在同一套代碼管理目錄中,通過幾個(gè)步驟來配置:example添加一個(gè)生成庫的Target;通過prepare_command編譯Target輸出對(duì)應(yīng)庫;podspec中通過s.version判斷當(dāng)前使用的哪個(gè)版本, 判斷是否通過prepare_command輸出二進(jìn)制庫 or 使用源代碼。(這樣同一個(gè)版本就需要上傳2個(gè)tag)。
分tag管理解決了下面3個(gè)問題:
1)可以不要將靜態(tài)庫上傳到git(如果包體積很大會(huì)很占用git空間);
2)一套代碼同時(shí)管理源碼和二進(jìn)制;
3)在源碼及二進(jìn)制間切換。
但是同時(shí)也有一個(gè)最大的缺點(diǎn):私有庫的tag需要打兩個(gè),podspec上傳時(shí)需要傳兩次。
該方法具體實(shí)施可以參考:https://juejin.cn/post/6844904202813046797
5. podspec分subspecs管理
在podspec里面增加subspecs配置,然后項(xiàng)目的Podfile中根據(jù)subspecs選項(xiàng)使用對(duì)應(yīng)的配置, 這樣就解決了要上傳2次podspec的問題。
//// 私有庫podspec內(nèi)
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
//// 私有庫podspec內(nèi)
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)類實(shí)例, 而類和 xib 不在同一 bundle 內(nèi)造成錯(cuò)誤. 所以需要在 xib 的 Identity Inspector->Custom Class->Module 指定類所屬模塊.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
若pod Install 報(bào)錯(cuò),請(qǐng)檢查系統(tǒng)編譯方式。http://www.itdecent.cn/p/9fc6503c276f
原文地址:http://www.itdecent.cn/p/7abcb17d50e6
iOS組件化開發(fā)之cocoapods使用
http://www.itdecent.cn/p/069e91b9f8d5