使用Swift Package Manager为二进制目标添加软件包依赖

14
我正在开发一个闭源框架,将以SPM方式分发为XCFramework。这得益于Swift工具5.3中提供的新的binaryTarget(name:path:)binaryTarget(name:url:checksum:)方法。在没有依赖的情况下,这个方法运行良好。
WWDC 2019的Swift二进制框架演讲指出“二进制框架不能依赖于包”,但这是在5.3之前,而且根本不可能有二进制目标。在Swift论坛上有一个建议的解决方法,基本上是围绕添加一个虚拟目标来列出依赖项(binaryTarget(...)方法没有dependencies参数)。
解决方法在依赖项有自己的依赖项之前有效。例如,没有任何依赖项的Lottie可以正常工作,但是有很多依赖项的Auth0会出现错误Missing required modules: 'Auth0ObjectiveC', 'SimpleKeychain'。即使使用SPM直接将Auth0添加到客户端项目中,也无法解决这些错误。
这是我的Package.swift文件,部分工作正常。
// swift-tools-version:5.3
import PackageDescription
let package = Package(
    name: "MyFramework",
    platforms: [
        .iOS(.v13)
    ],
    products: [
        .library(name: "MyFramework", targets: ["MyFramework", "MyFramework-Dependencies"])
    ],
    dependencies: [
        .package(name: "Auth0", url: "https://github.com/auth0/Auth0.swift.git", from: "1.30.1")
    ],
    targets: [
        .binaryTarget(name: "MyFramework", path: "MyFramework.xcframework"),
        .target(name: "MyFramework-Dependencies", dependencies: ["Auth0"], path: "MyFramework-Dependencies")
    ])

有没有可能让一个二进制框架依赖于一个包?如果不行,那么正确的方式是如何为一个二进制框架分发依赖项呢?

你找到了解决这个问题的合适方案吗?我也在想同样的事情。 - IgorGanapolsky
1
@IgorGanapolsky 我们已经将依赖于这些依赖项的部分提取到一个单独的标准 SPM 包中,然后请求第三方开发人员将其注入到主框架中。 - Nikola Lajic
1个回答

9
我们通过创建一个包装目标解决了这个问题,该目标依赖于二进制框架和其他依赖项。在这里可以看到一个示例here

1
抱歉回复晚了,因为假期和休假。根据您发布的内容,我已经更新了Package.swift,使得MyFramework有一个依赖于MyFrameworkWrapperAuth0MyFrameworkBinaryMyFrameworkTarget目标。导入MyFrameworkTarget不会引发任何错误,但它不会暴露来自MyFrameworkBinary的任何内容。如果我尝试导入MyFrameworkWrapper,情况也是一样的。导入MyFrameworkBinary会引发我在问题中发布的相同错误。我是否漏掉了什么步骤? - Nikola Lajic
我曾经遇到过同样的问题,并采用了这种方法。但是,由于无法链接子依赖项,我仍然遇到了构建错误。如果有人知道原因,请看一下我的详细问题:https://dev59.com/Y8Tra4cB1Zd3GeqPySSn - smartsanja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接