翻译自:Five Things You Must Know About Xcode 10 New Build System
发布日期是:Oct 26, 2018。现在很多问题都已经解决了。
New Build System,下文统一简称为NBS。
Apple在Xcode9中,以预览模式发布了NBS。那时候,NBS默认不激活。但是,在Xcode10中,NBS默认是激活的,在已有的iOS项目中,采用NBS,你可能会引发一些问题。Apple意识到了其中的一些问题,并单独为NBS发布了日志。他们还对一些已经发现的问题,提出了可能的解决方法。你可以阅读Apple的关于NBS的完整的发布日志Xcode New Build System。在之前发布的博客Blog中,我们已经介绍了NBS的内部细节。在这篇博客中,我们将会介绍iOS开发者面临的,但是Apple发布日志没有介绍的最普遍的五个问题。
Xcode 10: New Build System
回顾一下Xcode10的NBS,它可以Files-> Project/Workspace配置里激活,并且可以在新旧Build System之间来任意选择。
可以查看上一篇关于Build System的博客Blog,获得关于Build System的详细信息。如果你是用命令行的xcodebuild指令来build iOS项目,必须要传递额外的参数
UseModernBuildSystem=YES
,它会强制Xcode使用NBS。新的构建系统称为xcbuild。 Apple的xcbuild二进制文件位于下面提到的路径中:/Applications/Xcode.app/Contents/SharedFrameworks/XCBuild.framework/Versions/A/Support/xcbuild
NBS并行的构建Targets和Build Phases,以加快Swift项目的整体构建速度。一旦在Xcode里激活NBS,在享受到快速构建的好处时,我们也会面临NBS的相关问题。这里将会介绍一些NBS引发的最常见的问题,并同时提供这些问题可能的解决方法。我们根据在iOS项目里受影响的方面,将这些问题分类。
Info.plist
当iOS项目使用NBS时,一些关于info.plist的问题就开始出现了。这里关于NBS和info.plist文件的规则,你必须知道。
1.在任何Target的build phase里,Copy Bundle Resources里不应该包含任何plist文件,否则,NBS将无法构建app。同样,某个Bundle里文件被拷贝多次,NBS也无法工作。
2.NBS在执行Clean和增量构建时,运行Info.plist有不同的优先级。在Clean是,运行info.plist是在处理资源文件后,在关联storyboards之前,而增量构建是在签名之前。
3.如果Target只是拥有Info.plist文件,但是Info.plist文件不在任何Xcode关联的文件中时,NBS会运行失败。
CocoaPods
在iOS项目里使用CocoaPods,会引入一些问题,其中一些常见的如下:
1.开发模式的Pods不能更新,除非执行Clean。在Build Phase里嵌入的pods framework 不能可靠的执行。Github上的这个问题 here。
2.项目的Archive可能会失败,或者因为一些与CocoaPods相关的build phase 脚本不能可靠的执行而导致的一些令人迷惑的行为。
总而言之,Cocoapods与NBS不能很好的协同工作。
Run Script Phase
使用NBS时,你可能会在运行脚本阶段失败或者抛出令人迷惑的结果。不要着急,原因如下:
在Xcode10,运行脚本阶段改进了很多,但是我们必须在运行脚本阶段,为构建系统指定输入文件。我们是否为run script阶段指定输入文件,对构建系统决定是否执行Target的脚本很重要。Xcode 构建系统尝试平行运行多个任务,如果运行脚本时,脚本依赖的输入文件还没有生成,构建系统就会产生困惑并失败。在任何可行的情况下,最好将输入文件提供给脚本。当输入文件的数量很多,Xcode10给我们提供了一种方式,在.xcfilelist格式的文件中指定所有的输入文件,然后将这个文件添加到build phase里。当没有输入文件,更改的输入文件或缺少输出文件时,Xcode构建系统将始终运行此构建阶段。添加这些文件非常重要,以避免在不需要时为所有增量构建运行此阶段。
Clean Build Folder Action
伴随着NBS,Xcode的Clean操作废弃了,引入了Clean Build Folder操作。新引入的操作会删除iOS应用程序的所有派生数据,从而导致从头开始构建更清洁的版本。这意味着如果你使用Cocoapods,这个操作会从头开始构建所有的frameworks,这将会导致构建iOS项目的巨大延迟。如果你使用重新构建frameworks的Carthage(另一种库管理工具),这个操作不会有太多的影响。如果你有Clean的习惯,你需要对这种延迟更加小心。你同样可能会面临缓慢的Xcode索引问题。
XCCONFIG Files
绝大部分开发者可能使用.xcconfig 文件,管理特殊Targets的Xcode build settings。在xcconfig文件里的条件变量赋值也会有问题,它们可能会超乎预料,引发构建失败。为了检查你的xcconfig文件,Apple建议运行如下命令:
defaults write com.apple.dt.XCBuild EnableCompatibilityWarningsForXCBuildTransition -bool YES
如果这条命令显示了警告和错误,我们需要修复它们以获得稳定的构建。
Conclusion
Apple设计了NBS是为了提升Swift构建的性能,稳定性和可靠性。在应用的开发前期,它可能会导致一些配置错误。NBS在Xcode10已经默认激活了,之后我们必须升级我们的构建过程去适应NBS。当然,NBS会为APP带来很多配置增强。你是否已经迁移到了NBS?你体验到了些什么?你是否遇到了这篇Blog里没有提到的问题呢?