返回

XCFramework 与 SPM 依赖项管理指南:告别重复导入

IOS

XCFramework 与 SPM 依赖项:告别重复导入

简介

当在应用程序中导入依赖于 SPM 包的 XCFramework 时,可能会遇到重复导入和符号重复定义的错误。本文将探讨两种解决方案,帮助您解决此问题。

问题:重复导入

当应用程序导入 XCFramework 时,它也会导入框架的依赖项,即使应用程序本身并不需要这些依赖项。这会导致符号重复定义,因为依赖项中的符号已在应用程序中定义。

解决方案 1:隐藏依赖项

您可以使用 @_implementationOnly 属性在 XCFramework 的根模块中隐藏对依赖项的导入。这将使依赖项仅在框架内部使用,而不会暴露给使用框架的应用程序。

@_implementationOnly import CryptoSwift

解决方案 2:使用二进制目标

在应用程序的 Package.swift 文件中,您可以将 XCFramework 导入为二进制目标。这将使应用程序直接使用 XCFramework 的二进制代码,而不会导入框架的依赖项。

import PackageDescription

let package = Package(
    name: "ExampleApp",
    dependencies: [
        .binaryTarget(name: "ExampleSDK", path: "ExampleSDK.xcframework")
    ]
)

让应用程序查看依赖项

如果您希望应用程序查看嵌入在 XCFramework 中的依赖项,需要在 XCFramework 的 modulemap 文件中添加对依赖项的引用。

  1. 打开 ExampleSDK.modulemap 文件。
  2. 添加以下行:
module ExampleSDK {
  umbrella header "ExampleSDK.h"
  export *
  module CryptoSwift {
    header "CryptoSwift.h"
    export *
  }
}

结论

通过隐藏依赖项或使用二进制目标,您可以解决应用程序中重复导入的问题。如果您需要让应用程序查看嵌入的依赖项,可以使用 modulemap 文件。这些解决方案将帮助您创建干净、高效且可维护的应用程序。

常见问题解答

  1. 为什么隐藏依赖项很重要?

    • 隐藏依赖项可以防止符号重复定义,提高应用程序的稳定性和可维护性。
  2. 二进制目标与隐藏依赖项有何区别?

    • 二进制目标直接使用 XCFramework 的二进制代码,而隐藏依赖项仅在 XCFramework 内部使用依赖项。
  3. 我应该在所有情况下使用二进制目标吗?

    • 否,如果您需要应用程序查看 XCFramework 中的依赖项,则不应使用二进制目标。
  4. 如何更新嵌入在 XCFramework 中的依赖项?

    • 在 XCFramework 中重建并重新签名依赖项,然后重新构建和重新签名 XCFramework。
  5. 为什么需要让应用程序查看依赖项?

    • 在某些情况下,您可能需要应用程序能够访问 XCFramework 中的依赖项,例如调试或集成第三方库。