Swift 包管理器使包依赖于远程 XCFramework

问题描述 投票:0回答:1

我需要将应用程序分解为通过 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"),
    ],
ios swift xcode facebook swift-package-manager
1个回答
2
投票

是的,可以,但是语法错误。这不是

.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。

© www.soinside.com 2019 - 2024. All rights reserved.