最近在基于cocoapods做SDK开发,到了版本发布日遇到了个问题。版本发布时,需要将podspec文件推送到cocoapods官方仓库中,在推送的时候报错,校验不通过。
网上很多cocoapods库开发教程,本文不再赘述,只单纯描述一下遇到的问题。
首先执行 pod trunk push **.podspec --allow-warnings --use-libraries --verbose,突然报错,提示如下图
这是一个很经典的错误。在日常开发过程中,xcode10经常会出现这个错误,其原因是xcode10采用了New Build System,之前的一些内容无法编译通过。常见的解决办法是在xcode中将编译系统设置为 Legacy Build System。
问题来了,cocoapods在执行pod trunk push 或者 pod lib lint时,会自动生成一个xcode工程,而此时的xcode工程由于本机是xcode10, 所以默认就是New Build System。那怎么办呢?
有两个解决方法,一个是本机安装xcode 9,使用xcode-select命令将其设置为默认编译器;另一个是让cocoapods使用Legacy Build System。
第一种方法太过粗暴了,本文不再赘述,我们主要看下第二种方式。那如何才能让cocoapods使用Legacy Build System呢?
我们继续看刚才的报错,是在执行xcodebuild的时候报错的,也就是说cocoapods内部会执行xcodebuild命令,我们首先得知道xcodebuild是否支持编译系统的选择。庆幸的是,通过一番搜索,可以通过添加选项来使其使用Legacy Build System。
那么现在问题来了,xcodebuild命令并不是我们手动执行的,而是pod trunk push内部执行的,也就是说pod会在push之前进行一次校验,校验的时候会使用xcodebuild来进行编译,编译报错,则直接终止push。如果我们能直接修改pod命令所对对应的校验脚本,那么问题就迎刃而解了。
那么如何找到这个校验脚本呢?首先在终端运行 gem which cocoapods命令,该命令会输出cocoapods.rb文件路径。
与该文件同级的目录下有个cocoapods目录,这个目录下就存在一个名为 validator.rb文件,该文件就是我们要找的校验脚本文件。
那么如何修改呢?xcode打开这个文件,搜索 def xcodebuild, 在对应的代码块下添加 command += %w(-UseModernBuildSystem=NO),保存即可。
再次运行pod trunk push命令,通过。