解决由于 xcconfig 文件导致的 arugment list too long 问题

579 阅读2分钟

在我们的项目中,使用 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。

为了规避这个问题,尝试了多种解决方案:

  1. 将 pod 的代码打包成 framework。未解决: 打包成 framework 签名有问题。
  2. 源码接入,可以解决,但不是很优雅。

暂时解决了打包问题后,回头查看问题出在了哪里。报错信息:

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
  1. 更换 build system 为 Lecacy Build System

  2. 是由于文件路径太深导致的,写一个脚本在打包时将所有的 swift 文件路径放到最外层的文件夹里,将路径拍平

  3. 在 podfile 里增加

     install! 'cocoapods', :disable_input_output_paths => true`
    

进过测试,以上的方式在我们项目中均不适用。而且怀疑真正的报错信息被掩盖了。

然后根据里面的一张图片我注意到了我们的 Configurations 和其他项目的不太一样。

  1. 将 project 里的 configure 设置为 None,打包测试一下,依然失败。
  2. 将自定义的 xcconfig 换成 pod 生成的 xcconfig,成功。
  3. 将自定义的 xcconfig 换成 pod 生成的 xcconfig,并取消第一步设置,失败。

经过多次验证,找到了导致失败的配置项。

OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"z"

经过查看, pod 的 xcconfig 都引入了这些库,因此没有必要再引入一次,可以删除。

至此,问题解决。