如何使用 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
]
)
我正在尝试使用 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
]
)