什么是组件二进制化?
- 在iOS开发中,事实标准是我们使用CocoaPods生成、管理和使用library。这里的library就是一个模块、组件或库。二进制化指的是通过编译把组件的源码转换成静态库或动态库,以提高该组件在App项目中的编译速度。
为什么我们需要二进制化呢?
- 在我们App开发中,我们逐渐的抽象了很多模块、业务、UI等把他转换成私有CocoaPod库。其中有很多我们自己的组件是用Swift写的,源码格式为.Swift。在app项目编译时.Swift部分代码编译非常慢。 随着业务的扩展,私有CocoaPod库和第三方CocoaPod库越来越多,App项目中的文件也越来越多。每次pod install安装新库或pod update更新库的时候,重新编译的过程需要等待很长时间。这也向我们提出了加快编译速度的需求。
下面是使用的工具个人理解上的对比,如果有不对的地方往指正和沟通,互相进步和学习
Cocopods组件二进制插件
- 二进制化后,可以看出我们编译的target变少了,少了RxSwift.....这些target,这些就时间差的由来。
-
cocoapods-bin(是一个非cocoapods的开源项目)
- 该插件进行二进制化的策略是采用双私有源,即2个服务器一个静态服务器保存预先打好包的.a或者framework,一个是我们现在保存源码的服务器,在install的时候去选择使用下载那个。
- 该插件优点缺点也十分明显
- 优点:源码和二进制文件之间可以来回切换,速度比较快
- 缺点:源码的变动不能及时得到响应,而且需要第二个私有服务器
-
cocoapods-packager(cocoapods的开源项目)
- 该插件是cocoapods的一个插件,主要是来将私有库打包成二级制的一个插件,通过修改*.podspec文件
- 该插件的优缺点:
- 优点:可以将私有库打包成二级制文件,由组件本身去管理二进制文件,方便为主项目集成,私有库变动等
- 缺点:该库已经有很长一段时间不维护了,很多问题都未解决,而且我们的组件里依赖相对比较复杂,使用的Swift不能很好的支持。
-
cocoapods-binary(是一个非cocoapods的开源项目)
- 该插件是开源的Cocoapods推荐的的一个插件,主要是来将Podfile里所依赖的组件选择性打包成二级制的一个插件,通过修改Podfile文件里的内容
- 该插件的优缺点:
- 优点:选择性的在将那些组件使用二进制,不需要多个服务去存二级制文件,二进制文件在pod install的过程进行预编译,生成的项目之间依赖framework。源码变动能比较快的得到相应
- 缺点:二进制切换到源码文件的时候都会删除已经打好的二级制文件,下次切换需要重新编译新的二级制文件,这个过程比较耗时
Usage
1.安装插件
gem install cocoapods-binary
2.在Podfile中加入以下内容
#引入插件
plugin 'cocoapods-binary'
#一定要使用framework
use_frameworks!
#该值打开后 默认所有的依赖都将开启二进制化
#all_binary!
#在依赖的组件后添加:binary => true/false 来切换源码和二级制 如果打开了上面的all_binary!后默认都是true
target "HP" do
pod "ExpectoPatronum", :binary => true
end