iOS 二进制化之路(CocoaPods && Carthage)

前言

  iOS 组件化之路的过程中,我们有一件事需要做---那就是二进制化,二进制化通常是针对我们项目中常用的但又很少更改的的第三方库,将第三方库打包成二进制文件减少协同开发中的文件冲突又可以大大的加快编译速度提高工作效率。

正文

  用过 Carthage 的人都知道,它能将 iOS 的第三方依赖编译成二进制文件,然后我们手动引入项目中,这可以说正是与 CocoaPods的优势所在,CocoaPods 则是 iOS工程组件化中不可或缺的角色,CocoaPods的第三方库之多、用户之广是其他工具所望尘莫及的。然而怎样将它两的优势结合起来呢?
我们知道 CocoaPods 可以支持配置Podspec来控制我们的第三方库依赖形势,

iOS 二进制化之路(CocoaPods && Carthage)_第1张图片
image.png

  我们平时都知道 CocoaPods是一个 Ruby工程,因此 Podspec也是一个 Ruby文件,由上图我们可以知道,我们的第三方库有源码和二进制文件等多种引用形式,我们每次制作三方库的时候我们都可以选择相应的文件形势,那么我们可能会思考,我们想在源码和二进制文件之间切换可以实现吗?既然 PodspecRuby 文件,那么一定支持 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 = 'https://github.com/Alamofire/Alamofire'
  s.social_media_url = 'http://twitter.com/AlamofireSF'
  s.authors = { 'Alamofire Software Foundation' => '[email protected]' }
  s.source = { :git => 'https://github.com/Alamofire/Alamofire.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的工程

iOS 二进制化之路(CocoaPods && Carthage)_第2张图片
image.png

  我们 pod install 后会生成 Pods.xcodeproj工程,这个工程里有我们需要的第三方依赖库,但并没有勾选 Shared, 因此:

carthage build --platform iOS --no-skip-current

Pods.xcodeproj工程是无效的. 然而事情并未就此结束,通过一番研究发现:

iOS 二进制化之路(CocoaPods && Carthage)_第3张图片
image.png

勾选 Shared的这个操作其实就是将对应第三方库的 .xcscheme文件从 xcuserdata/steve.xcuserdatad/xcschemes/移动到 xcshareddata/xcschemes/,知道这个原理后我们就可以用命令行进行相应的操作了。然后我们切换到 Pods文件夹里执行 carthage build --platform iOS --no-skip-current我们可以看到:
iOS 二进制化之路(CocoaPods && Carthage)_第4张图片
image.png

我们所依赖之库尽数便已编译完成。也就是说我们所依赖的源文件和二进制文件都有了,我们只需要生成相应的 .podspec即可。然后通过 Podfile文件里做相应的配置,来引用本地文件资源,便可以做到源码和二进制文件便捷切换。
iOS 二进制化之路(CocoaPods && Carthage)_第5张图片
image.png

Swift ----> static lib

iOS 二进制化之路(CocoaPods && Carthage)_第6张图片
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

来设置
注意:

  1. 真机打得包只能在真机环境下用, 模拟器打的包只能在模拟器上用
  2. cocoapods 的资源文件放在 ~/Library/Caches/CocoaPods 目录下

参考资料:
iOS里的动态库和静态库
Pod二进制化
深入理解 CocoaPods

你可能感兴趣的:(iOS 二进制化之路(CocoaPods && Carthage))