我们所有的应用程序都依赖于组织内部的多个CocoaPods。我们最近对大多数Pod进行了本地化,并使用SwiftGen为本地化的字符串生成静态常量。 SwiftGen可以完美地用作每个Pod中的预编译步骤。但是,当在我们的应用程序中使用这些Pod时,SwiftGen步骤将失败,因为本地化字符串文件和生成的输出文件的路径不存在。这就是所有步骤的设置。
•每个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 }
即使应用程序目标不使用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
无论Pod是从何处构建的,我如何编写一个可以工作的预编译步骤(即,它自己的Example项目或依赖于它的外部应用程序)?
SwiftGen每次必须执行一次,这似乎是很愚蠢的。另一个项目中包含一个pod,因为我们签入了它生成的文件。我还探讨了将SwiftGe预编译添加到每个pod的Example目标的选项,但是由于Example目标是在 其依赖项的目标之后执行的,因此pod源将无法编译,因为生成的尚未生成文件。还有另一种方法吗?