主角:大概有 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.
复制代码
然后就开始了一下午的排错之路...
经过:
-
一开始,我们怀疑是本地 CocoaPods 版本和 CI 服务器的 CocoaPods 冲突导致的,然后发现服务端没有安装 CocoaPods,压根不需要
pod install
操作。 -
然后我们尝试在本地重新
pod install
,觉得可能是我们哪里缓存没清除,当然,经过了半小时的挣扎后后我们排除了这个愚蠢的想法; -
之后我们对比了最近的几次提交,观察到
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/5a67544a6fb9a01ca10b1072
转载请注明原作者及以上信息。