浩子的小站

Cocoapods采坑记 - Podfile.lock 冲突问题

字数统计: 699阅读时长: 2 min
2018/01/10

故事的开端是这样的:

我们的项目中使用了FBRetainCycleDetector这个第三方库来检查内存泄露,在升级到某一个版本后,出现部分同事的 podfile.lock中FBRetainCycleDetector的checksum 值不一致,每次都需要运行 pod install 来更新 podfile.lock,然后git push 到仓库。其他的同事又出现 podfile.lock 冲突,需要运行 pod install 更新,然后push到 git 仓库。

喜剧上演多次后,我们采取少数服从多数的原则,让出现冲突的同事git push 的时候手动去掉 podfile.lock。

podfile.lock冲突

Podfile.lock 不一致的原因:

Podfile.lock和Manifest.lock:

  • 项目中集成 cocoapods 的时候,运行 pod install 后,项目根目录中会生成Podfile.lock,而Pods目录中会有Manifest.lock。
  • Xcode 编译项目的时候,会执行 Build Phases 中的[CP] Check Pods Manifest.lock 脚本,这个脚本会比对Podfile.lock和Manifest.lock,如果两个文件不相同就会报错

xcode编译脚本

pod check失败

Podfile.lock是什么:

  • Podfile.lock 文件主要包含三个块:PODS、DEPENDENCIES、SPEC CHECKSUMS,用来记录每个pod的版本号、依赖的其他库和每个库对应的podspec.json文件的 checksum(SHA-1算法)。通过这些信息可以确保多人协作的时候,大家使用的是相同版本的第三方库。

在我们的项目中遇到的是 podfile.lock 中 checksum 部分的冲突,其实就是由于FBRetainCycleDetector.podspec.json文件的checksum不一致。

通过对比了有冲突的同事 mac 中生产的FBRetainCycleDetector.podspec.json文件,发现主要是repuires_arc 字段中的文件列表顺序不同。


在找到问题产生的原因后,就着手解决问题:

一开始怀疑是MAC的 locale 不同导致文件的排序不一致,因为之前使用翻译脚本来做文件排序的时候,也出现过类似的问题。

1
system("LANG=zh_CN.utf-8 sort $tmpFileOut | uniq >> $fileNameOut”);

但是在设置了 locale环境变量之后,问题还是没有解决。

前两天,在FBRetainCycleDetector的 issues 列表中,发现也有人遇到了相同的问题,更加可喜的是,这个小伙子提了一个 PR 修复了这个问题,其实只有一行代码:

PR 代码

问题是如何解决的:

在运行 pod install 后,生成FBRetainCycleDetector.podspec.json文件中, repuires_arc字段是需要设置-fno-objc-arc的文件列表,但是不知道某种原因,出现文件路径排序在不同电脑上不同,从而导致最后FBRetainCycleDetector.podspec.json的CHECKSUMS(SHA-1) 值不一致。

使用 sort 方法后,解决了文件排序问题。Cheers!

参考资料:

CATALOG
  1. 1. 故事的开端是这样的:
  2. 2. Podfile.lock 不一致的原因:
  3. 3. 问题是如何解决的: