内容简介:首发布于公众号iOS 知识小集。苹果随着 Xcode 9 的 preview 模式发布了回顾一下 new build system,从 Xcode 10 开始,可以从**
首发布于公众号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 之间切换。
查看之前关于 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
如果这个命令报任何警告和错误,我们需要修复它,获得稳定的编译。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- C# 9 新特性:代码生成器、编译时反射
- Xcode 编译疾如风系列(二):并行编译
- 编写 MSBuild 内联编译任务(Task)用于获取当前编译环境下的所有编译目标(Target)
- 使用 Visual Studio 编译时,让错误一开始发生时就停止编译(以便及早排查编译错误节省时间)
- Go编译缓存导致C文件修改后未重新编译
- Android Apk反编译系列教程(一)如何反编译APK
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。