XCFramework 的 .swiftinterface 在使用 Swift 包管理器导入时中断编译

XCFramework's .swiftinterface breaks compile when imported with Swift Package Manager

为 XCFramework 创建了一个 Swift 包 (// swift-tools-version:5.3.0)。该软件包依赖于其他 4 个 Swift 软件包(其中 2 个使用 swift-tools-version < 5,另外 2 个 >= 5.0)。它在项目的演示应用程序目标中构建并运行。生成的 XCFramework 复制到 Swift 包存储库并托管在 GitHub.

然后我创建一个新项目,Swift 包可以通过 SPM 成功导入其中。依赖项也被导入。

在构建新项目时,由于框架生成的 .swiftinterface 文件中的错误,我的框架无法编译,'XMLIndexerDeserializable' 不是 'SWXMLHash' 的成员类型:

任何人都可以解释一下这个失败吗?不确定这是我打包的框架的问题,导入它的新项目的配置问题,还是由于错误Swift 工具版本依赖项的差异。

关于我的配置和过程的一些背景细节

我的 Swift 包配置:

// swift-tools-version:5.3.0
import PackageDescription
let package = Package(
    name: "MyPackage",
    platforms: [
        .iOS(.v9)
    ],
    products: [
        .library(
            name: "MyPackage", 
            targets: ["MyPackage"])
    ],
    dependencies: [
        .package(name: "CryptoSwift", url: "https://github.com/krzyzanowskim/CryptoSwift", .upToNextMinor(from: "1.2.0")),
        .package(name: "Alamofire", url: "https://github.com/Alamofire/Alamofire", .upToNextMinor(from: "4.8.2")),
        .package(name: "AEXML", url: "https://github.com/tadija/AEXML", .upToNextMinor(from: "4.4.0")),
        .package(name: "SWXMLHash", url: "https://github.com/drmohundro/SWXMLHash", .upToNextMinor(from: "4.9.0"))
    ],
    targets: [
        .binaryTarget(
            name: "MyPackage",
            path: "MyPackage.xcframework")
    ]
)

观看了关于构建 XCFrameworks/binaries SPM 的 WWDC 2019 和 2020 会议以及其他各种教程。使用以下 sh 脚本构建将用于我托管的 Swift 包的 XCFramework:

xcodebuild archive \
  -scheme MyPackage \
  -sdk iphoneos \
  -archivePath "./XCFrameworkArchives/ios_devices.xcarchive" \
  BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
  SKIP_INSTALL=NO
  
xcodebuild archive \
  -scheme MyPackage \
  -sdk iphonesimulator \
  -archivePath "./XCFrameworkArchives/ios_simulators.xcarchive" \
  BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
  SKIP_INSTALL=NO

xcodebuild -create-xcframework \
  -framework ./XCFrameworkArchives/ios_devices.xcarchive/Products/Library/Frameworks/MyPackage.framework \
  -framework ./XCFrameworkArchives/ios_simulators.xcarchive/Products/Library/Frameworks/MyPackage.framework \
  -output ./XCFrameworkArchives/MyPackage.xcframework

XCFramework 被复制到我的 Swift 包存储库中,推送到 GitHub 并标记。

然后我创建了一个新项目,使用 SPM 添加依赖项并引入 MyPackage 及其依赖项。

添加代码以导入 MyPackage 并使用它。尝试构建项目抛出导致我寻求帮助的编译错误。如果您能提供帮助并需要更多信息,请尽我所能澄清并提供更多信息。

我手动编辑了 XCFramework 中为设备和模拟器版本生成的 .swiftinterface 文件。我只是从这些文件中替换了所有出现的框架名称。如此变化, SWXMLHash.XMLIndexerDeserializable -> XMLIndexerDeserializable 帮我解决了这个问题。

另外,看看我的问题的最新评论,这看起来像是一个已知问题。通过其中一些链接和错误问题,我的解决方案很常见,但不是“推荐”的解决方案。建议不要将您的框架命名为与 类 中相同的名称。在我的情况下,它是我导入的 Swift 包依赖项,所以我无法控制它。