Cocoapods原理分析及版本冲突问题

在iOS项目开发中,大部分都会使用Cocoapods作为依赖库管理工具,在这里和大家分享总结下CocoaPod相关原理

1. pod install原理

1.1pod installpod update区别

  • pod install:执行该命令,会去优先查找是否有podfile.lock文件,如果有有该文件,会直接从该文件中读取符合podfile要求的版本信息,如果需要安装的库不在podfile.lock中,则会根据podfile中的版本描述去检索,下载好后更新podfile.lock文件
  • pod update:该命令忽略podfile.lock文件信息,直接读取podfile文件进行信息检索下载,下载好后更新podfile.lock文件

1.2下载原理

  • 根据tag或者version检索到匹配的提交版本

    = 0.1 任何大于等于0.1的版本
    ~> 0.1 0.1的版本到0.2的版本,包括0.1,不包括0.2,总是匹配最新版本

  • 检索出该提交中的.podspec文件,验证s.name与podfile中的是否一致,不一致则Unable to find a specification for 'xxx
  • 验证成功,根据s.source_files找到需要导入的代码文件,下载到本地

1.3集成原理

  • CocoaPods将所有下载的远程依赖库都放到一个名为pods的项目中,然后让主项目依赖Pods,pods项目最重会编译成libPods-target.a静态库文件,或者使用use_frameworks!之后编译成Pods_target.framework动态库文件,然后target去依赖这个.a或者.framework
  • 每个target会根据需要在Build Phases中插入Copy Pods Resources脚本,将Pods依赖库的各种文件复制到目标文件中
  • Install同时会生成target对应的Pod_target.debug.xcconfig配置文件,在编译时设置所有的依赖和参数

1.4版本控制

  • pod install之后,CocoaPods会生成Podfile.lockManifest.lock两个文件,Manifest.lock可以看成是Podfile.lock的副本
  • 在多人协同开发的过程中,Manifest.lock由于位于Pods文件夹下往往是被忽略提交管理的文件,Podfile.lock记录了当前pod的版本信息,项目中依赖的第三方库信息等,协同开发的过程往往提交用于告知同事同步pod信息
  • pod install会在target中插入Check Pods Manifest.lock脚本,检测Podfile.lockManifest.lock内容是否一致,不一致则说明pod信息发生了变更

2.版本控制解决方案

  • 统一提交Pods文件夹、podfile.lock、Manifest.lock
  • 修改Check Pods Manifest.lock脚本,当比对结果不一致时,执行pod install更新