Xcode 10中的构建系统(问题和解决方案)

随着Xcode 10的发布,我们被引入了一个用于编译和构建代码的新构建系统。 新的构建系统提供了改进的可靠性和构建性能,并且捕获了旧式构建系统没有的项目配置问题。

新的构建系统主要包括–

  1. 使用共享设置
  2. 新建系统
  3. 旧版构建系统(这就是一个很酷的名字!)

尽管新的构建系统与现有项目高度兼容,但由于以下原因,某些项目可能需要更改:

  • 新的构建系统对构建元素之间的周期进行了更严格的检查,以防止不必要的重建。
  • 由多个构建命令生成的构建中的任何单个文件都是错误的。 例如,如果两个目标各自在Shell脚本阶段中声明了相同的输出文件,则将输出文件的声明分解为一个目标。
  • 如果将由Shell脚本生成的输出文件用作构建中其他位置的输入(例如,另一个Shell脚本的输入),则必须由生成它的脚本将该输出声明为显式输出; 否则,构建系统可能会尝试在文件生成之前搜索文件,从而导致构建失败。
  • 新的构建系统不支持在“始终搜索用户路径”( ALWAYS_SEARCH_USER_PATHS )设置为YES时生成的旧标题映射。 而是将ALWAYS_SEARCH_USER_PATHS设置为NO并使用现代标头包含语法进行迁移。 将项目存储库中任何需要的头文件添加到Xcode项目中,以确保它们可在#include中使用(通过项目范围的头文件映射)。 对于项目标头,请使用quote-style include( "example.h" ),对于系统标头,请使用尖括号包含( )。
  • 在运行Shell脚本构建阶段时,新的构建系统将undefined_arch传递为ARCH环境变量的值。 该值以前没有很好地定义。 取决于此值的任何shell脚本都必须对于正在构建的所有定义的体系结构正确运行,这些体系结构可以通过ARCHS环境变量获得。
  • 新的构建系统使用“干净的构建文件夹”行为。 不支持传统的“干净”行为。

在Xcode项目中,如果我们转到Xcode->文件->项目/工作区设置。 我们发现这样的东西–

配置为使用旧版构建系统的项目将在“活动视图”中显示一个橙色的锤子图标。

我们可以根据需要在旧系统和新构建系统之间切换。

New Build系统并行运行目标和构建阶段,以加快整体Swift的构建。 从Xcode激活后,我们将开始在iOS项目中获得收益以及与新构建系统相关的问题。

我们特别在不是在Xcode 10上而是在Xcode的先前版本上进行的项目中遇到很多问题。 这些问题可能会对项目的构建产生不利影响,并且会弹出错误,不必要地停止特定项目的构建。

下面给出了Xcode New Build System突出显示的一些最常见的错误。 此外,还需要反复解决此问题的解决方法! 他们是 –

1] Info.Plist

使用新构建系统构建iOS项目时,有关info.plist文件的新问题开始出现。 这是关于“新建系统”和“ Info.plist”文件必须了解的一些规则

解决方法:

  • 任何目标的“副本捆绑资源”构建阶段都不应有任何plist文件。 否则,新的构建系统将无法构建应用程序。 此外,如果文件在捆绑包中多次复制,则无法使用。
  • 新的构建系统在干净和增量构建中具有运行Info.plist步骤的不同优先级。 在干净的构建中,info.plist步骤是在处理资产之后,链接情节提要之前,而对于增量构建,它在签名之前运行。
  • 如果目标仅具有Info.plist值,并且没有任何Xcode引用的文件夹,则Xcode构建系统将使构建失败。

2] CocoaPods

对于使用CocoaPods的iOS项目,引入了一些问题。 一些常见的问题是

解决方法:

  • 除非我们执行干净的构建,否则Development Pods不会更新。 嵌入式Pod框架的构建阶段无法可靠地执行。 Github上有一个与此有关的问题
  • 由于某些与Cocoapods相关的构建阶段脚本无法可靠运行,因此应用程序的存档可能会失败或在应用程序中出现不稳定的行为。

简而言之,Cocoapods和New build系统不能很好地协同工作。

3]运行脚本阶段

对于新的构建系统,您可能会遇到“运行脚本”阶段开始失败或出现不稳定结果的问题。 有一个原因–

在Xcode 10中,运行脚本构建阶段有了很大的改进,但是,我们必须通过为运行脚本阶段指定一些输入文件来帮助构建过程。 如果我们在运行脚本阶段指定了“输入文件”,这对于构建系统做出决定是否需要运行运行脚本(对于依赖目标构建)很重要。 Xcode构建系统试图并行运行一些任务,如果尚未生成运行脚本阶段的输入,则构建系统会感到困惑并失败。

解决方法:

在适用的情况下,最好将输入文件提供给运行脚本。 当输入文件的数量增加时,Xcode 10为我们提供了以.xcfilelist格式指定所有输入文件的方法,我们可以在构建阶段将该文件添加为文件列表输入。 当没有输入文件 ,更改的输入文件或缺少输出文件时,Xcode构建系统将始终运行此构建阶段 。 添加这些文件非常重要,以避免在不需要时为所有增量构建运行此阶段。

4]清理构建文件夹操作

在新的生成系统中, 不建议使用 Xcode的clean操作,并且引入了Clean Build Folder操作。 新引入的操作从iOS应用程序中删除了所有派生数据,从而导致清理程序从头开始构建。 这意味着,如果您使用的是Cocoapods,它将从头开始重建所有框架,并导致构建iOS项目的巨大延迟。 如果您将Carthage与预建框架一起使用,则不会产生太大影响。 如果您有进行宗族建造的习惯,则需要格外小心。 您可能还会遇到Xcode索引编制缓慢的问题。

5] XCCONFIG文件

你们中的大多数人可能使用.xcconfig文件将Xcode构建设置保留在特定目标的某个位置。 存在一些问题,xcconfig文件中的条件变量分配可能无法按预期方式工作,从而导致构建失败。

解决方法:

为了检查您的xcconfig文件,Apple建议运行命令,如果此命令显示任何警告或错误,我们需要修复该问题以获得稳定的版本。 命令是–

默认写com.apple.dt.XCBuild EnableCompatibilityWarningsForXCBuildTransition -bool是

这已在Xcode 10中默认设置,因此迟早我们必须更新构建过程以适应新的构建系统。 当然,它将在应用程序中带来很多配置增强!

如有任何疑问,请发表评论!