【问题标题】:Xcode 10, sourcery & swiftlint build phases orderXcode 10、sourcery 和 swiftlint 构建阶段顺序
【发布时间】:2019-02-23 17:28:07
【问题描述】:

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

  1. 使用Sourcery生成一些文件
  2. SwiftLint linting
  3. 构建

配置工作如下:

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

... 使用“.sourcery.yml”的配置文件 扫描来源... 找到239种。 正在加载模板... 加载了 9 个模板。 生成代码... 完成的。 处理时间 0.491948962211609 秒 ...

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

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

工作正常,过程也很好,但最终,构建会失败:

错误:找不到构建输入文件: '/path/Generated/FromResponse.generated.swift', ...

所以这很奇怪,因为文件在物理上就在那里,并且根据构建设置文件应该在生成它们之后进行编译。那么我应该如何在构建过程中处理 sourcery 呢?

【问题讨论】:

    标签: xcode xcode10 swiftlint sourcery


    【解决方案1】:

    我们能够以与此 Github 问题类似的方式“修复”此问题:

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

    我们必须将 Sourcery 生成的每个文件添加到输出文件夹中,它会被 Xcode 正确拾取。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 取消选中“基于依赖分析”
      【解决方案3】:

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

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

      touch .alwaysRun
      

      作为要运行的 shell 命令的最后一行,并将构建阶段“输入文件”标记为 $(SRCROOT)/.alwaysRun。这似乎可以解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-07
        • 2013-11-15
        • 2019-04-11
        • 1970-01-01
        • 1970-01-01
        • 2022-10-14
        • 2019-05-15
        相关资源
        最近更新 更多