【问题标题】:How to access my app’s derived data folder itself?如何访问我的应用程序的派生数据文件夹本身?
【发布时间】:2021-02-12 07:44:05
【问题描述】:

我正在将我的 iOS 应用的 Firebase 依赖项从 CocoaPods 转移到 Swift 包管理器。

Firebase 的 Crashlytics 需要在构建应用时执行脚本(使用运行脚本构建阶段)。回到 CocoaPods 时代,我曾经以 documented by 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 文件夹不容易被引用。

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},但它们也会根据操作产生不同的路径。

那么,问题来了……

有没有办法可靠地引用我应用的派生数据文件夹的根目录(即~/Library/Developer/Xcode/DerivedData/MyApp-abcde使用 Xcode 的构建变量?

【问题讨论】:

    标签: ios xcode firebase swift-package-manager xcode-build-settings


    【解决方案1】:

    我正在修改我的答案,因为我意识到我没有回答你的问题..

    我有一个运行脚本,它将构建目标复制到一个新文件夹中。这适用于构建和存档。请注意,您需要 -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 对于构建/发布似乎有所不同,但通过在构建时将文件复制到已知位置,您将知道在哪里可以找到它们。

    【讨论】:

      【解决方案2】:

      你很亲密。这应该有效:

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

      【讨论】:

      • 您的路径似乎适用于运行和存档操作。非常感谢!
      • 对于 Xcode Server Bot(Xcode 12.4 时代)使用:${XCS_DERIVED_DATA_DIR%/*}/Dependencies/checkouts
      【解决方案3】:

      Crashlytics 运行脚本

      从 Xcode 构建和运行:

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

      在 CI/CD 上从 Xcode Server 存档以供分发:

      ${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
      

      【讨论】:

        猜你喜欢
        • 2020-03-26
        • 2019-02-07
        • 2021-01-18
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多