在Cocoapods依赖项中运行SwiftGen

时间:2018-11-05 19:58:02

标签: ios swift xcode cocoapods swiftgen

我们所有的应用程序都依赖于组织内部的多个CocoaPods。我们最近对大多数Pod进行了本地化,并使用SwiftGen为本地化的字符串生成静态常量。 SwiftGen可以完美地用作每个Pod中的预编译步骤。但是,当在我们的应用程序中使用这些Pod时,SwiftGen步骤将失败,因为本地化字符串文件和生成的输出文件的路径不存在。这就是所有步骤的设置。

1:开发Pod设置

•每个pod项目都是使用pod lib create设置的,因此文件层次结构如下所示:

- Foo.podspec
+ Example
  + Example  <-- example project's source code
  - Example.xcodeproj
  - Example.xcworkspace
  - Podfile
+ Sources  <-- source files that make up the pod itself
  + Foo
    - FooStrings.swift  <-- file that's generated by SwiftGen
  - Resources
    + en.lproj
      - Foo.strings  <-- file used by SwiftGen to create constants
    + es.lproj
      - Foo.strings

要运行SwiftGen,Foo.podspec包含以下内容:

swiftgen = %Q(
    $PODS_ROOT/SwiftGen/bin/swiftgen strings
      --templateName structured-swift4
      -o $PODS_ROOT/Foo/FooStrings.swift 
      $PODS_ROOT/Foo/Resources/en.lproj/Foo.strings
)
spec.script_phase = { :name => 'SwiftGen',
    :script => swiftgen,
    :execution_position => :before_compile }

2:应用设置

即使应用程序目标不使用SwiftGen本身,应用程序的Podfile也需要直接依赖SwiftGen。这是因为SwiftGen不是真正构建框架或静态库的传统pod。它只是安装了一个命令行工具(swiftgen)。

执行应用程序目标时,吊舱的SwiftGen预编译步骤失败,因为它找不到输入或输出文件:

Showing All Errors Only
PhaseScriptExecution [CP-User]\ SwiftGen [31m`<podfile-root>/Resources/en.lproj/Foo.strings` is not a `path`[0m
Command PhaseScriptExecution failed with a nonzero exit code

这是正确的,因为当应用程序目标运行pod install时,依赖项的源文件被放置在$ POD_ROOT的子文件夹中,例如Foo/Sources/Resources/en.lproj/Foo.strings

3:问题

无论Pod是从何处构建的,我如何编写一个可以工作的预编译步骤(即,它自己的Example项目或依赖于它的外部应用程序)?

4:其他方法

SwiftGen每次必须执行一次,这似乎是很愚蠢的。另一个项目中包含一个pod,因为我们签入了它生成的文件。我还探讨了将SwiftGe预编译添加到每个pod的Example目标的选项,但是由于Example目标是在 其依赖项的目标之后执行的,因此pod源将无法编译,因为生成的尚未生成文件。还有另一种方法吗?

0 个答案:

没有答案