Xcode 10 新编译系统你需要了解的 5 个特性

3,963 阅读5分钟

首发布于公众号 iOS 知识小集

苹果随着 Xcode 9 的 preview 模式发布了Xcode New Build System,默认是不开启的。Xcode 10 中默认是开启的,在你的已有工程中适应 new build system 可能面临一些问题。苹果完全意识到其中的一些问题,然后创建了独立的关于 new buiuld system 发布说明。我们在之前的 blog post 中覆盖了 new build system 的内部细节,我们将要覆盖 iOS 开发者可能会遇到但苹果的发布说明中没有详细介绍的前 5 个问题,例如使用第三方工具 build new system。

Xcode 10: New Build System

回顾一下 new build system,从 Xcode 10 开始,可以从**Xcode-> Files-> Project/Workspace Settings**激活 new build system,我们可以在 legacy 和 new build system 之间切换。

new build system

查看之前关于 Xcode new build system 的 blog post 获得详细信息。如果你用 xcodebuild 在命令行里编译 iOS 工程,我们不得不传入额外的参数 -UseModernBuildSystem=YES强制使用 new build system。new build system 叫 xcbuild。苹果的 xcbuild 二进制文件路径如下所示。

/Applications/Xcode.app/Contents/SharedFrameworks/XCBuild.framework/Versions/A/Support/xcbuild

New Build System 并行运行目标和构建阶段以加速整个 swift 编译。一旦从 Xcode 激活,我们将会开始从我们的 iOS 工程中的 new build system 中获益,同时遇到相关问题。我们将会介绍 Xcode New Build System 带来的常见问题和解决这些问题的潜在解决方法。我们将按照在 iOS 应用中每个受影响的范围分类这些问题。

1] info.plist

当一个 iOS 工程使用 New Build System 编译,一些基于 info.plist 文件的问题开始出现。这里有一些基于 New Build System 和 Info.plist 文件的规则你必须知道。

  • 任何 target 的 Copy Bundle Resources 编译阶段不应该有任何 plist 文件。否则 new build system 不会编译 app。另外,bundle 里的文件被复制多次,编译也不通过。

  • new build system 在 clean 后和增量编译中运行 info.plist 具有不同的优先级。clean 后编译,info.plist 在处理资源文件之后,链接 storyboard 之前,然而增量编译在签名之前。

  • 如果目标在仅在 Info.plist 有值,没有任何 Xcode 的引用文件目录,Xcode 编译系统编译失败。

###2] CocoaPods

iOS 工程有一些使用 CocoaPods 产生的问题。一些常见问题是:

  • 开发中的 Pods 只在运行 clean 后的编译更新。包含的 pods frameworks 编译阶段执行不稳定。Github 有一个相关 issue
  • 打包 app 可能失败,或者 app 内由于一些 Cocoapods 相关的编译阶段脚本运行不可靠造成可能有不稳定的表现。

简言之,Cocoapods 和 New build system 在一起工作工作不太好。

3] Run Script Phase

使用 new build system,你可能遇到 Run Script 阶段开始失败或是给出不稳定的结果。不要担心,这是一个关于这个问题的一个好结果。

在 Xcode 10 中, run script 编译阶段提升了很多,然而,我们不得不通过为 run script 阶段指定一些输入文件,帮助编译阶段处理。如果我们在 run script 阶段指定输入文件,对编译系统做出正确决定是重要的,就像 run scripts 需不需要被执行对于依赖的目标编译。Xcode 编译系统尝试并行的运行一些任务,如果 run script 阶段的输入没有被生成,编译系统迷惑然后失败。在适当的时候给 run scripts 提供输入文件始终是个好主意。随着输入文件增多,Xcode 10 提供在 .xcfilelist 格式问题件指定所有输入文件的方式,我们能够在 build phase 中以文件列表的形式添加这些文件。Xcode 编译系统始终会在没有输入文件,改变输入文件和丢失输出文件的时候运行 build phase。添加这些文件是重要的,避免在不必须的时候为所有增量编译系统运行这个 phase。

4] Clean Build Folder Action

使用 new build system,Xcode 的 clean 操作被废弃了,推荐使用 Clean Build Folder 操作。新的推荐的操作移除所有 iOS 应用的派生数据,引发从零开始干净的编译。这意味着如果你使用 Cocoapods,这会从零开始重新编译所有的 frameworks,在编译 iOS 工程时造成巨大的延时。如果你使用 Carthage 预编译 frameworks,不会有那么大的影响。如果你有 clean 编译的习惯,你需要特别关注这个等等待。同事也会面临缓慢的 Xcode 索引问题。

5] XCCONFIG Files

开发者大多会使用 .xcconfig 文件在某处为特殊的 targets 保持 Xcode 编译设置。这里有一些问题,在 xcconfig 文件里设置的一些条件变量可能不按逾期生效,导致编译失败。为了检查你的 xcconfig 文件,苹果推荐运行下面的命令。

defaults write com.apple.dt.XCBuild EnableCompatibilityWarningsForXCBuildTransition -bool YES

如果这个命令报任何警告和错误,我们需要修复它,获得稳定的编译。

结尾

苹果 new build system 为了提高 Swift 编译的性能,稳定性和可靠性。它会在应用开发早期阶段捕获配置错误。Xcode 10 已经默认开启,不久之后我们就不得不更新我们的编译过程以适应 new build system。可以肯定的是,它会为 app 中带来很多提升。你已经转向 new build system 了吗?你有什么经验吗?你遇到过文中未提及的其他问题吗?

原文链接:

Five Things You Must Know About Xcode 10 New Build System