我正在尝试从我为客户构建的自定义 xcframework 创建一个 Swift 包。该框架依赖于几个第三方框架。我读到过,尽管二进制框架不直接支持依赖项,但有办法通过“包装器”目标来实现这一点,所以这就是我为 Package.swift 提出的想法:
let package = Package(
name: "SBFramework",
platforms: [
.iOS(.v16)
],
products: [
// Products define the executables and libraries a package produces, and make them visible to other packages.
.library(
name: "SBFramework",
targets: ["SBFramework-Target"]),
],
dependencies: [
// Dependencies declare other packages that this package depends on.
.package(url: "https://github.com/apple/swift-algorithms.git", from: "1.0.0"),
.package(url: "https://github.com/fakeurl/NumbersKit.git", from: "1.0.0")
],
targets: [
.target(name: "SBFramework-Target",
dependencies: [
.target(name: "SBFramework", condition: .when(platforms: [.iOS])),
.product(name: "Algorithms", package: "swift-algorithms"),
.product(name: "NumbersKit", package: "NumbersKit")
]
),
.binaryTarget(name: "SBFramework", path: "SBFramework.xcframework")
]
)
这有效,我可以将包添加到我的测试项目中并导入框架,它也链接到依赖项,并且在功能上一切正常。
问题是每次我运行应用程序时,它还会在 Xcode 控制台中显示这些消息:
objc[845]: Class _TtC14NumbersKitP33_0FE53357E470A64027C8F0CAF7B114C812BundleFinder is implemented in both /private/var/containers/Bundle/Application/EEE0C0A6-4FF5-44BC-B81A-F95401219D32/TestSBFrameworkImport.app/Frameworks/SBFramework.framework/SBFramework (0x100f4aaf0) and /private/var/containers/Bundle/Application/EEE0C0A6-4FF5-44BC-B81A-F95401219D32/TestSBFrameworkImport.app/TestSBFrameworkImport (0x10069b778). One of the two will be used. Which one is undefined.
不同类的多行显示“类 X 在 [.../MyApp.app/Frameworks/MyFramework.framework/MyFramework/] 和 [.../MyApp.app/MyApp] 中实现” 。我不确定如何避免这个问题,以及这是否会导致问题。作为此 Swift 包基础的框架与这两个依赖项相关联,因为没有它们我将无法构建框架。但它们还需要添加到应用程序目标中(至少,如果我不这样做,我在使用 NumbersKit 初始化程序时会遇到运行时崩溃。
有什么好的办法可以解决这个问题吗?我担心当客户将其集成到他们的应用程序中并且该应用程序部署到数千台设备时,这可能会给客户带来问题。
最佳答案
是的,这是一个真正的问题,您应该解决它。如果实现冲突,它可能会产生非常微妙的错误。
我希望您在框架和应用程序中都链接 NumbersKit。你绝对不能这样做。 NumbersKit 必须恰好链接一次。这可能是由于将 SPM 与直接链接混合在一起而不是让 SPM 完成所有工作。如果您的主应用程序也需要 NumbersKit,请确保将其添加为包,就像您的框架所做的那样,以便 SPM 可以解析单个副本以进行链接。
关于带有依赖项的 Swift 包在控制台中给出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76377783/