如何使用 Swift 包管理器的 binaryTarget?

How to use Swift Package Manager's binaryTarget?

我正在尝试使用 Swift 包管理器的 binaryTarget 来包含此处可用的 Stripe xcframework https://github.com/stripe/stripe-ios/releases/tag/v19.3.0. The package manager doesn't complain, and lets me link to it, but I can't import it im. I've made a sample repo to show it here https://github.com/martyu/StripePackageTest。我错过了什么吗?

首先,您的示例不可测试,因为您忘记提供版本标签,所以这不是真正的包。

其次,也是更重要的一点,我认为您对包作为二进制目标的工作方式存在误解。您似乎认为您的 Swift 包可以包含可查看 XCFramework 的代码。 (这就是为什么您要在包的源代码中的框架模块中尝试 import 的原因。)这是错误的。导入框架模块的是app。包只是分发框架的一种方式。

也就是说,你可以写一个源码包,也可以写一个框架承载包。一包不可兼得。

但是你当然可以写一个依赖于框架承载包的源代码包。

首先,您不需要版本标签就可以成为“真正的包”。 You can specify package dependencies via commit SHA and branch as well。您也可以通过 file:// 在 xcode 中添加本地包存储库。请注意,这与本地开发覆盖不同。

我在 swift build 方面运气不佳,但我确实通过在 Xcode 中创建应用程序并将包添加到其中来使其正常工作。我认为这就是@matt 的意思。您需要将它导入到一个项目(xcode,或另一个 SP)中,然后 xcode 将 assemble 所有的依赖项,当它 ~~build~~ 感觉像它时。

这是我使用的修改后的 Package.swift。我将名称更改为 Example(因为这可能是您正在构建的依赖于 Stripe 的 SDK)。如果您希望将“Stripe”嵌入到其框架中,则可以在示例库的目标中包含它。否则,客户端应用程序也只需要导入它(通过在 Xcode 中添加它时的复选框,或通过 dependencies 在另一个 Package.swift 中)。

// swift-tools-version:5.3
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "Example",
    platforms: [
        .iOS(.v11)
    ],
    products: [
        .library(
          name: "Example",
          type: .dynamic,
          targets: ["Example"]),
        .library(
            name: "Stripe",
            targets: ["Stripe"])
    ],
    dependencies: [],
    targets: [
        // I thought this was defining the Stripe binaryTarget...
        .binaryTarget(name: "Stripe",
                      url: "https://github.com/stripe/stripe-ios/releases/download/v19.3.0/Stripe.xcframework.zip",
                      checksum: "fe459dd443beee5140018388fd6933e09b8787d5b473ec9c2234d75ff0d968bd"),
        // ... and then linking it to the Example project here via "dependencies" ...
        .target(name: "Example", dependencies: ["Stripe"], path: "Sources")
        // ... so when I'm in "Example" files, I thought I'd be able to import "Stripe" to them
    ]
)