Как получить доступ к самой папке производных данных моего приложения?

Я занимаюсь переносом зависимости 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 отличается для сборки / выпуска, но, скопировав файлы в известное место во время сборки, вы будете знать, где их найти.

Другие вопросы по тегам