Все наши приложения зависят от нескольких CocoaPods, которые являются внутренними для нашей организации. Недавно мы локализовали большинство модулей и используем SwiftGen для генерации статических констант для локализованных строк. SwiftGen отлично работает как шаг предварительной компиляции в каждом из модулей. Тем не менее, когда эти модули используются в наших приложениях, шаги SwiftGen резко проваливаются, потому что пути к файлам локализованных строк и сгенерированным выходным файлам не существуют. Вот как все настроено.
1: настройка модуля разработки
• Каждый проект модуля был настроен с использованием 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: настройка приложения
Приложение Podfile
должно иметь зависимость непосредственно от SwiftGen, даже если цель приложения не использует сам SwiftGen. Это потому, что SwiftGen не является на самом деле традиционным модулем, который создает фреймворк или статическую библиотеку; он просто устанавливает инструмент командной строки (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: Вопрос
Как я могу написать шаг предварительной компиляции, который работает независимо от того, из чего собран модуль (т. Е. Его собственный пример проекта или внешнее приложение, которое зависит от него)?
4: другие подходы
Кажется глупым, что SwiftGen должен выполняться каждый раз, когда модуль включен в другой проект, так как мы проверяем файл, который он генерирует. Я также исследовал возможность добавления предварительной компиляции SwiftGe к цели примера каждого модуля, но поскольку цель примера выполняется после целей его зависимостей, исходный код модуля не будет компилироваться, поскольку сгенерированный файл еще не был создан. Есть ли другой способ сделать это?