Как получить доступ к самой папке производных данных моего приложения?
Я занимаюсь переносом зависимости Firebase моего приложения iOS с CocoaPods на Swift Package Manager.
Crashlytics Firebase требует, чтобы сценарий выполнялся во время сборки приложения (с использованием фазы сборки Run Script). Еще во времена CocoaPods я называл скрипт способом, задокументированным Google:
"${PODS_ROOT}/FirebaseCrashlytics/run"
.
После того, как я перешел на SPM, файлы Firebase больше не находятся в
${PODS_ROOT}
, а такой переменной нет вообще. Я знаю, что нужный мне файл теперь находится в папке
DerivedData
папка, а именно в
~/Library/Developer/Xcode/DerivedData/MyApp-abcde/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run
. Проблема в том, что
MyApp-abcde
на папку нелегко сослаться.
Я нашел сообщение Medium, предлагающее использовать
${BUILD_DIR}
build переменная (в отношении приведенного выше примера она разрешит
<…>/MyApp-abcde/Build/Products
) и вызывая
dirname
команда для перемещения вверх по иерархии каталогов.
Этот хак работал только для запуска приложения. Когда я пытался его заархивировать,
${BUILD_DIR}
решено на другой путь, а именно
<…>/MyApp-abcde/Build/Intermediates.noindex/ArchiveIntermediates/MyApp/BuildProductsPath
. Я попробовал еще несколько переменных сборки, например
${SYMROOT}
, на месте
${BUILD_DIR}
, но они также создают разные пути в зависимости от операции.
Итак, вот вопрос...
Есть ли способ надежно ссылаться на корень папки производных данных моего приложения (т.е.
~/Library/Developer/Xcode/DerivedData/MyApp-abcde
) с использованием переменных сборки Xcode?
3 ответа
Вы были близки. Это должно работать:
${BUILD_DIR%Build/*}SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run
Скрипт запуска Crashlytics
Для сборки и запуска из Xcode:
${BUILD_DIR%Build/*}SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run
Чтобы заархивировать для распространения с XcodeServer на CI / CD:
${XCS_DERIVED_DATA_DIR%/*}/Dependencies/checkouts/firebase-ios-sdk/Crashlytics/run
Чтобы работать с обоими одновременно:
if [[ "${XCS_DERIVED_DATA_DIR}" == "" ]]; then
${BUILD_DIR%Build/*}SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run
else
${XCS_DERIVED_DATA_DIR%/*}/Dependencies/checkouts/firebase-ios-sdk/Crashlytics/run
fi
Я переделываю свой ответ, так как понял, что не ответил на ваш вопрос..
У меня есть сценарий запуска, который копирует цели сборки в новую папку. Это работает как для сборки, так и для архива. Обратите внимание, что для перехода по символической ссылке вам понадобится -L при копировании
# Copy the built framework into a sibling to the project folder
if [[ "$CONFIGURATION" == "Debug" ]]; then
mkdir -p "$PROJECT_DIR/../../iwins-ios-sdk/debug"
rm -rf "$PROJECT_DIR/../../iwins-ios-sdk/debug/IWiNS_SDK.framework"
cp -LR "$BUILD_DIR/Debug-iphoneos/IWiNS_SDK.framework" "$PROJECT_DIR/../../iwins-ios-sdk/debug"
else
mkdir -p "$PROJECT_DIR/../../iwins-ios-sdk/release"
rm -rf "$PROJECT_DIR/../../iwins-ios-sdk/release/IWiNS_SDK.framework"
cp -LR "$BUILD_DIR/Release-iphoneos/IWiNS_SDK.framework" "$PROJECT_DIR/../../iwins-ios-sdk/release"
fi
Кроме того, вы можете найти все envvars сборки здесь:https://gist.github.com/gdavis/6670468
Итак, похоже, что $BUILD_DIR отличается для сборки / выпуска, но, скопировав файлы в известное место во время сборки, вы будете знать, где их найти.