无法编译依赖于第 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=NO
和 BUILD_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 方部门。
我目前正在尝试编译一个 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=NO
和 BUILD_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 方部门。