如何访问应用程序的派生数据文件夹本身?

问题描述

我正在将iOS应用的Firebase依赖关系从CocoaPods转移到Swift Package Manager。

Firebase的Crashlytics要求在构建应用程序时执行脚本(使用“运行脚本”构建阶段)。在CocoaPods时代,我曾经用documented by Google"${PODS_ROOT}/FirebaseCrashlytics/run"的方式来调用脚本。

切换到SPM后,${PODS_ROOT}中将不再包含Firebase文件,并且根本没有此类变量。我知道我现在需要的文件位于DerivedData文件夹中,尤其是在~/Library/Developer/Xcode/DerivedData/MyApp-abcde/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run上。问题是 MyApp-abcde文件夹不容易引用。

A Medium post I found建议使用${BUILD_DIR}构建变量(对于上面的示例,它将解析为<…>/MyApp-abcde/Build/Products),并调用dirname命令将其向上移动。目录层次结构。

此hack仅适用于运行该应用。当我尝试对其进行存档时,${BUILD_DIR}决定使用另一条路径,即<…>/MyApp-abcde/Build/Intermediates.noindex/ArchiveIntermediates/MyApp/BuildProductsPath。我尝试了其他一些构建变量,例如${SYMROOT}来代替${BUILD_DIR},但根据操作,它们也会产生不同的路径。

所以,问题来了……

是否可以使用Xcode的构建变量可靠地引用我的应用程序的派生数据文件夹的根(即~/Library/Developer/Xcode/DerivedData/MyApp-abcde)??

解决方法

你很接近。这应该有效:

${BUILD_DIR%Build/*}SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run
,

我正在重新整理我的答案,因为我意识到我还没有回答您的问题。

我有一个运行脚本,它将构建目标复制到一个新文件夹中。这适用于构建和存档。请注意,您需要在复制时加上-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

此外,您还可以在这里找到所有构建环境: https://gist.github.com/gdavis/6670468

因此,$ BUILD_DIR在构建/发行方面似乎有所不同,但是通过在构建时将文件复制到已知位置,您将知道在哪里可以找到它们。