iOS 組件化方案 —— 組件二進(jìn)制化

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']

DEMO

使用Swift時(shí)候的注意點(diǎn):

  1. 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 指定類所屬模塊.

  2. 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ò)誤.

  3. 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

  4. 在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

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

相關(guān)閱讀更多精彩內(nèi)容

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