前言
iOS 组件化之路的过程中,我们有一件事需要做---那就是二进制化,二进制化通常是针对我们项目中常用的但又很少更改的的第三方库,将第三方库打包成二进制文件减少协同开发中的文件冲突又可以大大的加快编译速度提高工作效率。
正文
用过 Carthage
的人都知道,它能将 iOS 的第三方依赖编译成二进制文件,然后我们手动引入项目中,这可以说正是与 CocoaPods
的优势所在,CocoaPods
则是 iOS
工程组件化中不可或缺的角色,CocoaPods
的第三方库之多、用户之广是其他工具所望尘莫及的。然而怎样将它两的优势结合起来呢?
我们知道 CocoaPods
可以支持配置Podspec
来控制我们的第三方库依赖形势,
我们平时都知道
CocoaPods
是一个 Ruby
工程,因此Podspec
也是一个 Ruby
文件,由上图我们可以知道,我们的第三方库有源码和二进制文件等多种引用形式,我们每次制作三方库的时候我们都可以选择相应的文件形势,那么我们可能会思考,我们想在源码和二进制文件之间切换可以实现吗?既然Podspec
是Ruby
文件,那么一定支持Ruby
语法,我们可以加入逻辑判断来控制我们是使用源码还是二进制文件:
Pod::Spec.new do |s|
s.name = 'Foundation+'
s.version = '4.5.1'
s.license = 'MIT'
s.summary = 'Elegant HTTP Networking in Swift'
s.homepage =
s.social_media_url =
s.authors = { 'Alamofire Software Foundation' => 'info@alamofire.org' }
s.source = { :git => :tag => s.version }
s.ios.deployment_target = '8.0'
s.osx.deployment_target = '10.10'
s.tvos.deployment_target = '9.0'
s.watchos.deployment_target = '2.0'
if ENV['source'] == true || ENV['Foundation+'] == true
s.source_files = 'Foundation+/Source/*.swift'
else
s.vendored_frameworks = "Carthage/Build/iOS/Foundation+.framework"
end
s.preserve_paths = 'Foundation+/'
end
很可惜这种方法在 github
远程公有仓库中无效(私有库的信息记录文件是以 *.podspec 格式存在的, 而共有库的文件是以 *.podspec.json 格式存在的),如果你们又更好的方法请告诉我😊。
当然,我们自己的三方库我们可以自己控制,然而我们项目中还有绝大多数的三方库是我们不能够控制的,那么,就没有办法了吗?当然,我们不会放弃寻找解决办法,我开始介绍了Carthage
, 它可以将我们的第三方库打包成二进制文件,当然,我们在这里不会使用它的所有功能,在 Pods
文件夹中我们已经下载了我们三方依赖的所有源码,我们只需要把它们编译成二进制文件即可。
carthage build --platform iOS --no-skip-current
但是,这句命令只适用于勾选了 Shared
的工程
我们
pod install
后会生成Pods.xcodeproj
工程,这个工程里有我们需要的第三方依赖库,但并没有勾选 Shared
, 因此:
carthage build --platform iOS --no-skip-current
对Pods.xcodeproj
工程是无效的. 然而事情并未就此结束,通过一番研究发现:
勾选
Shared
的这个操作其实就是将对应第三方库的 .xcscheme
文件从 xcuserdata/steve.xcuserdatad/xcschemes/
移动到 xcshareddata/xcschemes/
,知道这个原理后我们就可以用命令行进行相应的操作了。然后我们切换到 Pods
文件夹里执行carthage build --platform iOS --no-skip-current
我们可以看到:image.png
我们所依赖之库尽数便已编译完成。也就是说我们所依赖的源文件和二进制文件都有了,我们只需要生成相应的
.podspec
即可。然后通过 Podfile
文件里做相应的配置,来引用本地文件资源,便可以做到源码和二进制文件便捷切换。image.png
Swift ----> static lib
image.png我们可以通过
post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == "kvoblock"
target.build_configurations.each do |config|
config.build_settings['MACH_O_TYPE'] = 'staticlib'
config.build_settings['CONFIGURATION_BUILD_DIR'] = '../../kvoblock/Frameworks'
end
end
end
end
来设置
注意:
- 真机打得包只能在真机环境下用, 模拟器打的包只能在模拟器上用
- cocoapods 的资源文件放在
~/Library/Caches/CocoaPods
目录下