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 包依赖项,所以我无法控制它。
为 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 包依赖项,所以我无法控制它。