iOS组件化二进制化
wanyakun 8/21/2017 iOS
随着组件越来越多,壳工程打包依赖的组件每次都要重新编译,为了提高编译速度,将组件进行二进制化势在必行。而我们App是从8.0开始支持。所以我们组件二进制化采用static library和部分dynamic framework的方式。
# 组件二进制方案
- 多仓库模式管理:源码使用一个仓库,framework、static library使用一个仓库,或者和framework、static library集中使用一个仓库,通过subspec管理。缺点:需要额外维护仓库
- podspec宏管理:podspec部分代码如下,根据命令环境IS_SOURCE来决定是用源码还是framework、static library
if ENV['IS_SOURCE']
s.source_files = [
'MFSIdentifier/*.{h,m}',
'MFSIdentifier/**/*.{h,m}'
]
else
s.source_files = 'SDK/**/*.{h}'
s.ios.vendored_frameworks = 'SDK/*.framework'
end
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
缺点:在切换源码和framework、static library的时候会切换算有的组件,不能单独切换某个组件
- 单仓库、多podspec文件管理:在组件中增加一个目录存储发布framework的podspec和framework, 一个目录存储static library的podspec和.h .a文件,发布时使用不同的podspec文件。一般只发布framework、static library,源码直接用git地址做调试。(最好是发布一个源码一个framework的版本,通过Version后缀区分,但fastlane修改podspec版本命令目前不指定后缀,所以暂时没有实现)
我们采用第三种方式,未来fastlane若支持版本号可以带后缀,可以升级framework和源码的切换方法。
# 组件模板的变化
为了更好支持组件二进制化,对组件模板进行了一下修改:
- 增加lib目录,里面增加NAME.podspec, 发布static Library时使用此podspec进行发布
- 增加fmk目录,里面增加NAME.podspec,发布Framework组件时使用此podspec进行发布
- fastlane目录中的Fastfile文件增加publish_fmk和publish_lib命令,用来发布framework和static library组件,用法和publish命令一样。
fastlane publish_fmk version:1.1.0
,fastlane publish_lib version:1.1.0
- 其他ruby脚本修改等。
# 组件项目的变化
使用组件模板创建新组件后会在Example项目中增加FMK Podspec Metadata目录,里面为上一步组件模板中提到的发布framework组件使用的podspec,发布framework组件时根据修改进行更改。
# 发布命令的变化
- 发布framework组件使用新的发布命令:
fastalne publish_fmk version:1.1.0
, 发布static library组件使用新的发布命令:fastalne publish_lib version:1.1.0
, 旧的fastalne publish version:1.1.0
依然可以使用,组件发布为源码。 - build_framework命令调整,调整为build_fmk和build_lib,目标二进制文件到fmk和lib目录。
# 发布过程的变化
framework发布过程如下:
主要增加了一下步骤:
- 修改fmk目录下的podspec文件,修改version
- 13、14、15切换到build_framework命令进行archive和build,然后将二进制文件合并,最后放到fmk目录
- 使用fmk目录下的podspec进行发布
static library发布过程类似。
# 组件使用的变化
组件framework后,若需要对组件进行调试,可以切换到源码模式,可以在Podfile中设置git路径切换到源码。