Xcode 10、sourcery & swiftlint 构建阶段顺序

Xcode 10, sourcery & swiftlint build phases order

更新到 Xcode10 后,初始项目配置存在一些问题。步骤如下所示:

  1. 正在使用 Sourcery
  2. 生成一些文件
  3. 使用 SwiftLint
  4. 建造

配置是这样的:

这在 Xcode 9 中运行良好,但显然,它在 Xcode 10 构建系统下无法运行。问题是如果我下载存储库(.generated 文件不是存储库的一部分)。然后点击 build 它会显示如下结果:

... Using configuration file at '.sourcery.yml' Scanning sources... Found 239 types. Loading templates... Loaded 9 templates. Generating code... Finished. Processing time 0.491948962211609 seconds ...

所以 sourcery 工作正常,然后 linting:

Linting 'FromResponse.generated.swift' (1/186)

作为一个过程工作正常,但最后,构建将失败:

error: Build input files cannot be found: '/path/Generated/FromResponse.generated.swift', ...

所以这很奇怪,因为文件物理存在并且根据构建设置文件应该在生成文件之后编译。那么我应该如何在构建过程中使用 sourcery?

这与在 Xcode 中默认启用的新 Xcode 构建系统中的更改有关 10. 如果构建阶段创建的文件需要作为后续构建阶段的输入那么它需要在输出文件或输出文件列表中明确指定它们。

在您的示例中,Sourcery 构建阶段正在生成 Swift 个源文件,这些文件需要作为 Compile Sources 阶段的输入。

但是,此时的问题是,在您为 Sourcery 指定输出文件后,构建阶段不会每次都重新运行,因为它会看到输出文件已经存在。到目前为止,除了 运行 手动使用 Sourcery 和 SwiftGen 之类的工具或将生成的文件保存在 Git 中以便它们始终存在之外,到目前为止,我还没有为这部分制定出可用的解决方案.

我们能够 "fix" 以类似于此 Github 问题的方式解决此问题:

https://github.com/mac-cain13/R.swift/issues/438#issuecomment-416982928

我们必须将 Sourcery 生成的每个文件添加到输出文件夹,Xcode 会正确地提取这些文件。

我在构建阶段调用 mogenerator 构建我的数据模型 类 时遇到了类似的问题。 @Yuchen 给出的方法应该可以。

@Andrew:为了强制始终(重新)运行 宁这个构建阶段,我添加了行

touch .alwaysRun

作为 shell 命令的最后一行到 运行 并将构建阶段 "Input Files" 标记为 $(SRCROOT)/.alwaysRun。这似乎可以解决问题。