美文网首页
iOS 组件化方案 —— 组件二进制化

iOS 组件化方案 —— 组件二进制化

作者: 大成小栈 | 来源:发表于2023-06-19 20:27 被阅读0次

对于大量使用组件化开发的项目,将各个组件打包成二进制库可以有效提高项目编译速度,目前有以下方案:

1)分仓库管理
2)Carthage管理
3)podspec环境变量
4)podspec分tag管理
5)podspec分subspecs管理

1. 分仓库管理

创建了一个公用SDK仓库,专门放生成的Framework,spec文件内使用subspecs区分各个Framework。公用仓库和源码仓库切换。

缺点:需要额外维护一个公用SDK仓库;维护2个spec,源码仓库也需要升级;每次功能改动,需要打包并提交到公用SDK仓库。

2. Carthage

Carthage是一款去中心化的依赖管理器,只需要工程配置好,即可编译。

缺点: 支持的 Carthage 安装的第三方框架和依赖不如 CocoaPods 丰富;无法在 Xcode 里定位到源码;安装包的大小比用CocoaPods安装的包大。

3. podspec环境变量

利用podspec内支持if、else语法特点,在pod install的时在其前面设置传入参数, podspec走相关判断判断分支来配置资源拉去。

//// podspec内支持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

//// 执行pod install
  IS_SOURCE=1 pod install

缺点:每次都需要清除私有库的缓存;需要手动删除/Pods/XXX;不能针对单独库进行切换,除非自定义白名单之类的规则;

4. podspec分tag管理

二进制库与源码可在同一套代码管理目录中,通过几个步骤来配置:example添加一个生成库的Target;通过prepare_command编译Target输出对应库;podspec中通过s.version判断当前使用的哪个版本, 判断是否通过prepare_command输出二进制库 or 使用源代码。(这样同一个版本就需要上传2个tag)。

分tag管理解决了下面3个问题:
1)可以不要将静态库上传到git(如果包体积很大会很占用git空间);
2)一套代码同时管理源码和二进制;
3)在源码及二进制间切换。

但是同时也有一个最大的缺点:私有库的tag需要打两个,podspec上传时需要传两次。

该方法具体实施可以参考:https://juejin.cn/post/6844904202813046797

5. podspec分subspecs管理

在podspec里面增加subspecs配置,然后项目的Podfile中根据subspecs选项使用对应的配置, 这样就解决了要上传2次podspec的问题。

//// 私有库podspec内
  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内
  pod 'ABC', :git => "git@github.com:srs888001/BinaryLib.git", :tag => '0.1.5', :subspecs => ['Core']

DEMO

使用Swift时候的注意点:

  1. Error: Unknown class _SomeModuleSomeCell in Interface Builder file:
    这是由于组件中的 Xib 有对应的 class, xib 加载后会去将 outlet 赋值到对应类实例, 而类和 xib 不在同一 bundle 内造成错误. 所以需要在 xib 的 Identity Inspector->Custom Class->Module 指定类所属模块.

  2. Error: 'ASwiftFrameworkClass' is unavailable: cannot find Swift declaration for this class
    对 Swift framework 进行多 architecture 合并时, 除了 exec 可执行文件外, 还需要将 .framework/Modules 文件夹内的描述文件一并合并, 否则编译时会提示错误.

  3. Error: Module 'XXXX' not found
    在 Objective-C 源项目中导入 Swift framework 后, 会出现此错误, 需要在 Objective-C Target -> Build Settings 中, 设置alwaysEmbedSwiftStandardLibraries = YES

  4. 在Pod trunk push的时候出现arm64的错误
    原因是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 报错,请检查系统编译方式。https://www.jianshu.com/p/9fc6503c276f

原文地址:https://www.jianshu.com/p/7abcb17d50e6

iOS组件化开发之cocoapods使用
https://www.jianshu.com/p/069e91b9f8d5

相关文章

  • iOS组件化

    0.ios组件化/模块化1.iOS 组件化开发项目框架设计2.iOS 组件二进制化方案3.组件化4.Seemygo...

  • iOS组件化方案

    iOS组件化方案 iOS组件化方案

  • iOS打包加速与组件二进制化

    iOS打包加速与组件二进制化 随着iOS模块化灰度改造方案iOS模块化灰度 A/BTest的实施,以及组件化拆分的...

  • 组件化方案

    组件化方案引用 在现有工程中实施基于CTMediator的组件化方案 iOS组件化实践(一):简介 iOS组件化实...

  • iOS组件化文章汇总

    iOS应用架构谈 组件化方案 APP组件化之路 我所理解的组件化之路 iOS 组件化方案探索 围观神仙打架,反革命...

  • iOS 组件二进制化方案--(二)

    之前在iOS 组件二进制化方案--(一)中说明了进行组件二进制化的背景和目标,但方案实施后发现了诸多不足之处。 方...

  • iOS 组件化/模块化文章

    1.博客文章总结 iOS组件化思路-大神博客研读和思考iOS组件化实践方案-LDBusMediator炼就组件化架...

  • iOS端组件化架构开发与管理

    iOS组件化参考: Casa大神的iOS应用架构谈 组件化方案 组件化架构漫谈 开发管理 得益于Git&Cocoa...

  • iOS组件化 文章

    iOS组件化 BeeHive iOS应用架构谈 组件化方案 Small iOS BeeHive —— 一个优雅但还...

  • 07 CTMediator iOS组件化方案

    关于iOS组件化方案在Casa的iOS应用架构谈 组件化方案写得已经很清楚了。方案本身并不难,CTMediator...

网友评论

      本文标题:iOS 组件化方案 —— 组件二进制化

      本文链接:https://www.haomeiwen.com/subject/uyieydtx.html