我需要将应用程序分解为通过 SPM 分发的模块。每个模块都可以有一些依赖项,例如 FBSdk、Firebase 等。为了减少构建时间,我需要使我的包依赖于这些 SDK 的二进制版本而不是源代码。
这是我当前包的示例:
// 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: "Analytics",
platforms: [
.iOS(.v11)
],
products: [
// Products define the executables and libraries a package produces, and make them visible to other packages.
.library(
name: "Analytics",
targets: ["Analytics"]),
],
dependencies: [
// Dependencies declare other packages that this package depends on.
.package(name: "AppsFlyerLib", url: "https://github.com/AppsFlyerSDK/AppsFlyerFramework.git", from: "6.3.4"),
.package(name: "Amplitude", url: "https://github.com/amplitude/Amplitude-iOS.git", from: "8.3.0"),
.package(name: "Firebase", url: "https://github.com/firebase/firebase-ios-sdk.git", from: "8.0.0"),
.package(name: "Facebook", url: "https://github.com/facebook/facebook-ios-sdk.git", from: "9.3.0"),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages this package depends on.
.target(
name: "Analytics",
dependencies: [
"AppsFlyerLib",
"Amplitude",
.product(name: "FirebaseAnalytics", package: "Firebase"),
.product(name: "FacebookCore", package: "Facebook"),
]
)
]
)
如您所见,它取决于 FBSdk 的源版本,但它也作为 XCFramefork 分发,如您在 releases 部分
中看到的所以我的问题:是否可以从已发布的 XCFramework 而不是整个存储库定义依赖项?
类似这样的事情:
dependencies: [
// Other dependencies goes here
.package(name: "Facebook", url: "https://github.com/facebook/facebook-ios-sdk/releases/download/v11.1.0/FacebookSDK.xcframework.zip", from: "11.1.0"),
],
是的,可以,但是语法错误。这不是
.package
,这是.binaryTarget
。这是来自 Swift 库背后的团队的 Package.swift 示例 WalletCore
,他们正是这样做的,因为他们依赖于不易分发的 C 库。
let package = Package(
name: "WalletCore",
platforms: [.iOS(.v13)],
products: [
.library(
name: "WalletCore", targets: ["WalletCore", "SwiftProtobuf"]
)
],
dependencies: [
],
targets: [
.binaryTarget(
name: "WalletCore",
url: "https://github.com/hewigovens/wallet-core-spm/releases/download/0.0.1/WalletCore.xcframework.zip",
checksum: "c524cfcd8a6a811f40fb7f5dadfd671944da0c70d78befbec43f4b81a7b7cd47"
),
.binaryTarget(
name: "SwiftProtobuf",
url: "https://github.com/hewigovens/wallet-core-spm/releases/download/0.0.1/SwiftProtobuf.xcframework.zip",
checksum: "270a6545f72a512aafc7d7ecb73621005248d4ea44f7ebbc06a2f33c7d15bc4c"
)
]
)
注:
执行此操作时,在某些情况下会出现一些构建问题。不清楚具体的问题是什么。 WalletCore 库对我来说工作得很好,但另一个库做同样的事情,“Sodium”,会导致间歇性的构建问题,有时无法找到 .xcframework。它上面有一个开放的 rdar,它似乎在 Xcode 13 beta 上被称为“已知问题”。所以祈祷它会被修复为 13。