阅读 2538

模块化日常:CocoaPods 库资源引用问题

主角:大概有 20 个库

起因:前段时间在给某 App 做组件化,发了一堆奇怪的 CocoaPods 库,今天到了某个版本发布,然后将这些库引入了主工程,用测试机进行编译 / 打包 / 提测,嗯,没有任何问题,开心。然后发布系统编译打包,嗯,失败了。编译失败嘛,很正常,查日志啦。唉,打开日志发现,并没有返回任何错误日志...啥情况?调了一天,无果,找 CI 大佬们帮忙解决,然后发现打包系统是用直接下载 zip 压缩包的方式进行编译的,没有走 git,我们心想:有什么不同么,本地都能编译成功啊?然后试了试,卧槽,真的编不过,然后为啥不返回错误信息的问题也找到了,因为 Xcode 真的没有返回错误信息啊喂!

如上图所示,就一句:

Build operation failed without specifying any errors. Individual build tasks may have failed for unknown reasons.
复制代码

展开以后的详情为:

Build operation failed without specifying any errors. Individual build tasks may have failed for unknown reasons.
One possible cause is if there are too many (possibly zombie) processes; in this case, rebooting may fix the problem.
Some individual build task failures (up to 12) may be listed below.
复制代码

然后就开始了一下午的排错之路...

经过

  1. 一开始,我们怀疑是本地 CocoaPods 版本和 CI 服务器的 CocoaPods 冲突导致的,然后发现服务端没有安装 CocoaPods,压根不需要 pod install 操作。

  2. 然后我们尝试在本地重新 pod install,觉得可能是我们哪里缓存没清除,当然,经过了半小时的挣扎后后我们排除了这个愚蠢的想法;

  3. 之后我们对比了最近的几次提交,观察到 Build Phases 中的 [CP] Copy Pods Resources 部分,貌似有大量的资源文件引用方式的变更,遂发现,貌似有资源文件被重复引用了唉...

最后发现,若 CocoaPods 库中资源文件夹(默认是 Assets)中包含 .xcassets 类型的文件,则不能使用 s.resources = '[库名]/Assets/**/*' 递归引用所有文件,这样会造成对 .xcassets 文件中资源文件的重复添加,反正由于一系列奇怪的原因最后会导致我们的 CI 无法正常编译和打包我们的 App。

这个问题十分具有隐蔽性,因为我们在本机编译 / 打包 / Lint / Push 是完全没有问题不会报任何错误的,所以如果资源文件夹中包含 .xcassets 类型的文件,只能指定一级目录的包含 s.resources = '[库名]/Assets/*' 或者麻烦一些,手动指定 / 匹配所有资源文件。

接下来的工作就简单(并不)了,排查所有的 Pod 库,把资源引用方式有问题的库进行修改 / Lint / PR / 发版 / 引入,然后就浪费了一天的时间,开心(并不),🙄。

结论:原来 Xcode 还可以在不报任何具体错误的情况下强行构建失败...


如有任何知识产权、版权问题或理论错误,还请指正。
https://juejin.im/post/6844903554616934408
转载请注明原作者及以上信息。