首发布于公众号 iOS 知识小集。git
苹果随着 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。github
回顾一下 new build system,从 Xcode 10 开始,能够从**Xcode-> Files-> Project/Workspace Settings**激活 new build system,咱们能够在 legacy 和 new build system 之间切换。swift
查看以前关于 Xcode new build system 的 blog post 得到详细信息。若是你用 xcodebuild
在命令行里编译 iOS 工程,咱们不得不传入额外的参数 -UseModernBuildSystem=YES
强制使用 new build system。new build system 叫 xcbuild
。苹果的 xcbuild
二进制文件路径以下所示。xcode
/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 应用中每一个受影响的范围分类这些问题。bash
当一个 iOS 工程使用 New Build System 编译,一些基于 info.plist 文件的问题开始出现。这里有一些基于 New Build System 和 Info.plist 文件的规则你必须知道。app
任何 target 的 Copy Bundle Resources 编译阶段不该该有任何 plist 文件。不然 new build system 不会编译 app。另外,bundle 里的文件被复制屡次,编译也不经过。工具
new build system 在 clean 后和增量编译中运行 info.plist 具备不一样的优先级。clean 后编译,info.plist 在处理资源文件以后,连接 storyboard 以前,然而增量编译在签名以前。post
若是目标在仅在 Info.plist 有值,没有任何 Xcode 的引用文件目录,Xcode 编译系统编译失败。性能
###2] CocoaPodsui
iOS 工程有一些使用 CocoaPods 产生的问题。一些常见问题是:
简言之,Cocoapods 和 New build system 在一块儿工做工做不太好。
使用 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。
使用 new build system,Xcode 的 clean 操做被废弃了,推荐使用 Clean Build Folder
操做。新的推荐的操做移除全部 iOS 应用的派生数据,引起从零开始干净的编译。这意味着若是你使用 Cocoapods,这会从零开始从新编译全部的 frameworks,在编译 iOS 工程时形成巨大的延时。若是你使用 Carthage 预编译 frameworks,不会有那么大的影响。若是你有 clean 编译的习惯,你须要特别关注这个等等待。同事也会面临缓慢的 Xcode 索引问题。
开发者大多会使用 .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 了吗?你有什么经验吗?你遇到过文中未说起的其余问题吗?