目前,我正在尝试将一个快速包(我已经封装在xcodeproj中,专门用于将包作为二进制的快速包发布,并且仍然在示例应用程序中运行本地代码)编译到xcframework中,以便我也可以将它作为Cocoapod发布。该项目构建良好,并在同一个存储库中的示例应用程序中运行,因此我对代码本身相当有信心。但是,我在归档时遇到了问题;无法找到来自快速包的依赖项的类。两个deps (只有2个)都是第三方二进制快速包。
▸ Compiling MySegmentLabel.swift
❌ /Users/***/Sources/Views/MySegmentLabel.swift:4:39: cannot find type 'SegmentedControlSegment' in scope
public final class MySegmentLabel: SegmentedControlSegment {
^~~~~~~~~~~~~~~~~~~~~~~
** ARCHIVE FAILED **在上面的示例输出中,SegmentedControlSegment是一个来自第三方二进制xcframework依赖项的类。
我觉得这是我的归档命令或xcodeproj构建设置的问题,但我不知道需要调整哪些设置或以什么方式进行调整。
在我的xcodeproj构建设置中,我按照苹果的建议设置了SKIP_INSTALL=NO和BUILD_LIBRARY_FOR_DISTRIBUTION=YES (显式地将它们添加到归档命令中也没有帮助)。这是我用来存档xcodeproj的命令:
# Archives the target scheme passed-in to the script
function archive () {
local sdk=$1
local configuration=$2
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目标编译的,所以我几乎认为第三方库可能没有将x86_64框架绑定到它们的xcframework中(只是因为示例应用程序在我运行xcodeproj时在模拟器上运行得很好)。
发布于 2022-05-31 23:11:04
在我的例子中(这可能是一个罕见的问题),问题是第三方xcframework deps都是与设置一起编译的,以排除iphone仿真器的arm64 arch。因此,当我试图为所有标准archs (其中包括arm64,现在由于M1)存档iphone仿真器SDK时,当它为arm64存档时,它将找不到来自第三方deps的类引用。
理想情况下,第三方代理会修复他们的黑客攻击,以排除模拟器的arm64,但我不控制那些SDK,所以我只需要把这些依赖项从链上踢下来,所以最终客户端(这是一个我永远不需要存档的应用程序)现在必须依赖于那些第三方库,而我的快速包需要重构,这样就不需要直接访问那些第三方程序了。
发布于 2022-05-28 14:26:31
Swift软件包管理器不允许传递依赖项。客户端应用程序要么需要直接依赖第三方Swift包,要么您的包需要重新公开需要通过的API。
https://stackoverflow.com/questions/72411384
复制相似问题