美文网首页iOS、Swiftpod & git
iOS-组件化之二进制化

iOS-组件化之二进制化

作者: JerrySi | 来源:发表于2020-12-26 23:10 被阅读0次

    背景

    为了提高项目编译速度,对于大量使用组件化开发的项目组而言,组件二进制化是必然要走的路线,中心思想就是要将各个组件打包成二进制库。

    目前的方案

    • 分仓库管理
    • Carthage管理
    • podspec环境变量
    • podspec分tag管理
    • podspec分subspecs管理

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

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


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

    缺点


    podspec环境变量: 利用podspec内支持if、else语法特点。 通过pod install的时候传入参数, podspec判断参数配置编译。

      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
    

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


    podspec分tag管理:
    库与源码同一套代码管理

    1. example添加一个生成库的Target
    2. 通过prepare_command编译Target输出对应库
    3. podspec中通过s.version判断当前使用的哪个版本, 判断是否通过prepare_command输出库 或者 使用源代码。(这样同一个版本就需要上传2个tag)。

    分tag管理解决了下面3个问题:
    1.可以不要将静态库上传到git(如果包体积很大会很占用git空间)
    2.一套代码同时管理源码和二进制
    3.在源码及二进制间切换.
    但是同时也有一个最大的缺点:私有库的tag需要打两个,podspec上传时需要传两次

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


    podspec分subspecs管理: 主要就是podspec里面增加subspecs配置,然后项目中根据subspecs选项使用对应的配置, 这样就解决了要上传2次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
    
    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

    相关文章

      网友评论

        本文标题:iOS-组件化之二进制化

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