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'
= {
'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()
如果只需要某个组件实现二进制的链接,你可以
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
[ ] 支持多线程下载
已知问题
- 不支持framework中有xib文件,如果pod仓库中有xib文件且不在bundle中,需要设置:binary=>false
- 不支持多个target依赖同一个pod时,target的platform版本不一致的情况
- 不支持同一个pod,多个target且使用了不同的subspec
- framework_header_search_enabled不支持使用
#if __has_include(<FrameworkA/Header.h>)
方式设置的组件,如果有会出现重复定义的错误。如YYImage、YYWebImage等
感谢
感谢cocoapods-binary和cocoapods-binary-cache的作者,因为看了他们的源码之后受到了启发。