无法编译依赖于第 3 方 xcframeworks 的 xcframework

Cant compile xcframework that depends on 3rd party xcframeworks

我目前正在尝试编译一个 swift 包(我已经将其包装在一个 xcodeproj 中,专门用于能够将包作为二进制 swift 包发布并且仍然 运行 示例应用程序中的本地代码) 到 xcframework 中,这样我也可以将它作为 Cocoapod 发布。该项目在同一存储库中的示例应用程序中构建得很好,运行s,所以我对代码本身相当有信心。但是,我 运行 在归档时遇到了问题;找不到来自 swift 包的依赖项的 classes。两个 deps(只有 2 个)都是第三方二进制 swift 包。

▸ Compiling MySegmentLabel.swift

❌  /Users/***/Sources/Views/MySegmentLabel.swift:4:39: cannot find type 'SegmentedControlSegment' in scope

public final class MySegmentLabel: SegmentedControlSegment {
                                    ^~~~~~~~~~~~~~~~~~~~~~~

** ARCHIVE FAILED **

在上面的示例输出中,SegmentedControlSegment 是来自第 3 方二进制 xcframework 依赖项之一的 class。

我感觉这是我的归档命令或我的 xcodeproj 构建设置的问题,但我无法弄清楚我需要调整哪些或以何种方式调整。

在我的 xcodeproj 构建设置中,我按照 Apple 的建议设置了 SKIP_INSTALL=NOBUILD_LIBRARY_FOR_DISTRIBUTION=YES(将它们显式添加到存档命令也无济于事)。这是我用来存档我的 xcodeproj 的命令:

# Archives the target scheme passed-in to the script
function archive () {
    local sdk=
    local configuration=
    local build_path="$build_root/$sdk"
    local xcarchive_path="$archive_root/$SCHEME-$sdk.xcarchive"

    xcodebuild \
        -workspace $xcworkspace \
        -scheme "$SCHEME" \
        -configuration $configuration \
        -archivePath $xcarchive_path \
        -derivedDataPath $build_path \
        -sdk $sdk \
        -scmProvider system \
        -showBuildTimingSummary \
        archive | xcpretty

}

archive "iphonesimulator" "Debug" # specifically this one fails. It is able to archive for non-simulators
archive "iphoneos" "Release"

因为它只不为 iphonesimulator 目标编译,我几乎认为第 3 方库可能没有将 x86_64 框架捆绑到他们的 xcframeworks 中(除了不可能是因为示例当我 运行 xcodeproj 时,应用 运行 在模拟器上运行正常。

Swift 程序包管理器不允许传递依赖项。客户端应用程序要么需要直接依赖第三方 Swift 包,要么您的包需要 re-expose 需要传递的 API。

在我的例子中(这可能是一个罕见的例子)问题原来是第 3 方 xcframework deps 都被编译为排除 iphonesimulators 的 arm64 arch 的设置。因此,当我尝试为所有标准架构(由于 M1,现在包括 arm64)的 iphonesimulator sdk 归档我的 SDK 时,它在归档时无法从第 3 方部门找到 class 引用对于 arm64。

理想情况下,第 3 方部门会修复他们的 hack 以将 arm64 排除在模拟器之外,但我不控制这些 SDK,所以我只需要将这些依赖项踢下链,所以最终客户端(这是我的应用程序)我永远不需要存档)现在必须依赖那些第 3 方库,我的 swift 包需要重构,不需要直接访问那些第 3 方部门。