在我们的项目中,使用 pod 进行第三方库的集成,但又有一些不同环境下的配置,所以有自定义的 xcconfig 文件。然后在自定义的 xcconfig 文件中引入 pod 生成的 xcconfig 文件。详见:
https://stackoverflow.com/questions/24236596/edit-xcode-xcconfig-file-and-cocoapods
#include "../Pods/Target Support Files/Pods-Your-WorkSpace/Pod-Your-WorkSpace.debug.xcconfig"
之前在项目里,接入了一些辅助开发的 pod 仓库,但导致 archive 失败,就去掉了这些库,没有深究。
但是,在一次需求开发中,导入了新的必须的 pod。
为了规避这个问题,尝试了多种解决方案:
- 将 pod 的代码打包成 framework。未解决: 打包成 framework 签名有问题。
- 源码接入,可以解决,但不是很优雅。
暂时解决了打包问题后,回头查看问题出在了哪里。报错信息:
❌ error: unable to spawn process (Argument list too long)
这个问题网上一搜一大堆,具体的解决方案大概有几种
https://stackoverflow.com/questions/53226087/error-unable-to-spawn-process-argument-list-too-long-in-xcode-build
-
更换 build system 为 Lecacy Build System
-
是由于文件路径太深导致的,写一个脚本在打包时将所有的 swift 文件路径放到最外层的文件夹里,将路径拍平
-
在 podfile 里增加
install! 'cocoapods', :disable_input_output_paths => true`
进过测试,以上的方式在我们项目中均不适用。而且怀疑真正的报错信息被掩盖了。
然后根据里面的一张图片我注意到了我们的 Configurations 和其他项目的不太一样。
- 将 project 里的 configure 设置为 None,打包测试一下,依然失败。
- 将自定义的 xcconfig 换成 pod 生成的 xcconfig,成功。
- 将自定义的 xcconfig 换成 pod 生成的 xcconfig,并取消第一步设置,失败。
经过多次验证,找到了导致失败的配置项。
OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"z"
经过查看, pod 的 xcconfig 都引入了这些库,因此没有必要再引入一次,可以删除。
至此,问题解决。