I’m in the middle of moving my iOS app’s Firebase dependency from CocoaPods to Swift Package Manager.
Firebase’s Crashlytics requires a script to be executed while the app is building (using the Run Script build phase). Back in the CocoaPods days, I used to call the script the way documented by Google: "${PODS_ROOT}/FirebaseCrashlytics/run"
.
After I’ve switched to SPM, Firebase files are no longer in ${PODS_ROOT}
, and there’s no such variable available at all. I know the file I need is now located in the DerivedData
folder, specifically it’s at ~/Library/Developer/Xcode/DerivedData/MyApp-abcde/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run
. The problem is, the MyApp-abcde
folder is not easily referenced.
A Medium post I found suggested using the ${BUILD_DIR}
build variable (in regard to the example above, it would resolve to <…>/MyApp-abcde/Build/Products
), and calling the dirname
command to move up the directory hierarchy.
This hack worked only for running the app. When I tried to archive it, ${BUILD_DIR}
resolved to another path, namely <…>/MyApp-abcde/Build/Intermediates.noindex/ArchiveIntermediates/MyApp/BuildProductsPath
. I tried a few more build variables, such as ${SYMROOT}
, in place of ${BUILD_DIR}
, but they also produce different paths depending on the operation.
So, here comes the question…
Is there a way to reliably reference my app’s derived data folder’s root (i.e. ~/Library/Developer/Xcode/DerivedData/MyApp-abcde
) using Xcode’s build variables?
3
Answers
I’m reworking my answer as I realized I haven’t answered your question..
I have a run script that copies the build targets into a new folder. This works for both Build and Archive. Note that you need the -L on copy to follow the symlink
Also, you can find all of the build envvars here:
https://gist.github.com/gdavis/6670468
So, it appears that $BUILD_DIR is different for build/release, but by copying the files to a known location at build time, you’ll know where to find them.
You were close. This should work:
Crashlytics run script
To build&run from Xcode:
To archive for distribution from Xcode Server at CI/CD:
To work for both at the same time: