cocoapods-jxedt

cocoapods-jxedt提供组件二进制链接的功能,你不需要更改podspec源文件,只需要在Podfile文件中配置好use_binary的标识,执行pod install的时候就会帮你完成二进制链接的工作。 使用cocoapods-jxedt理论上来说可以使你的pods工程编译时间减少到秒级,取决于你怎样配置二进制文件。

Installation

使用已发布的插件

$ gem install cocoapods-jxedt

本地编译插件安装

$ rake build

$ sudo rake install

Usage

打开Podfile文件,在合适的位置添加

plugin 'cocoapods-jxedt'
all_binary!
binary_dir('../_Prebuild')

plugin 'cocoapods-jxedt'
options = {
    'all_binary': true, # 全部开启bianry,默认false
    'binary_dir': '../_Prebuild', # binary编译的最终路径,默认为'../_Prebuild'
    'binary_switch': true, # 二进制开关,设置为关则不hook pre_install过程,默认开
    'prebuild_job': true, #开启预编译任务,默认开启
    'excluded_pods': ['WIMPhotoBrowser', 'JXFavoriteLib'], # 排除binary的组件
    'framework_header_search_enabled': true, # 是否开启binary的header search path功能,默认不开启
    'configurations': ['Release', 'Debug'], # 支持的configurations,默认只编译Release
    'xcframework': false, # 编译结果是否为xcframework,默认false
    'dev_pods_enabled': false, # 开发中的pod是否支持binary,默认false
    'simulator_build_enabled': false, # 是否编译模拟器,默认不支持
    'clean_build': false, # build的时候是否clean,默认不clean
    'build_args': { # 编译的配置
        'default':["ONLY_ACTIVE_ARCH=NO", "BUILD_LIBRARY_FOR_DISTRIBUTION=YES"],
        'device':["ARCHS='arm64'"], # "ARCHS='arm64 armv7 armv7s'"
        'simulator':["ARCHS='x86_64'"] # "ARCHS='arm64 x86_64 i386'
    }
}
cocoapods_jxedt_config(options)

如果只需要某个组件实现二进制的链接,你可以

pod 'PodA', :binary => true # 明确的指定某个pod组件支持binary

pod 'PodB', :framework_header_search => false # 明确指出某个pod不支持配置framework的`HEADER_SEARCH_PATH`

原理

... 待完善

TODO

  • [x] 支持从已有framework文件完成源码和二进制切换
  • [x] 解决依赖的组件被打成framework,头文件依赖的问题
  • [x] 解决源码和二进制切换的问题,现有binary插件均不支持
  • [x] 支持不同环境(Debug、Release)编译时链接不同环境的framework
  • [x] 记录组件的hash(git提交)值,用户校验二进制的源码组件的版本。这个值在podfile.lock文件中
  • [x] 两次install去校验checksum值,确保源码和二进制是对应版本,checksum值校验通过才支持binary
  • [x] 添加是否从header_search_path中查找framework的header(为了兼容"" <> 这种方式引用头文件的问题)
  • [x] 插件支持编译为framework
  • [x] prebuild流程添加到pod的install流程中,形成闭环,使用二进制的时候,发现没有对应的二进制文件,那么可以预编译
  • [x] 添加pod jxedt options命令,输出配置文件详细介绍

  • [ ] 添加pod jxedt binary命令,支持命令行打包framework

  • [ ] 支持配置git地址做编译结果缓存

  • [ ] 支持缓存的fetch和push

  • [ ] 支持多线程下载

已知问题

  1. 不支持framework中有xib文件,如果pod仓库中有xib文件且不在bundle中,需要设置:binary=>false
  2. 不支持多个target依赖同一个pod时,target的platform版本不一致的情况
  3. 不支持同一个pod,多个target且使用了不同的subspec
  4. framework_header_search_enabled不支持使用#if __has_include(<FrameworkA/Header.h>)方式设置的组件,如果有会出现重复定义的错误。如YYImage、YYWebImage等

感谢

感谢cocoapods-binarycocoapods-binary-cache的作者,因为看了他们的源码之后受到了启发。