在 Swift 包管理器中添加对二进制目标的依赖项

sma*_*nja 5 ios swift swift-package-manager xcframework

我想创建一个带有具有子依赖项的二进制目标的 Swift 包。由于二进制目标不支持开箱即用的子依赖项,因此我创建了一个依赖于二进制框架和其他依赖项的包装器目标,如此处所述

包有一个名为 的目标LoggerCocoaLumberjack是 的依赖项Logger

Logger我已生成 XCFramwork 并托管在可公开访问的服务器中。下面我添加了用于生成 XCFramwork 的 Xcode 项目的屏幕截图。

请参阅包清单文件。

import PackageDescription

let package = Package(
    name: "spmpoc",
    products: [
        .library(
            name: "Logger",
            targets: ["LoggerTarget"]),
    ],
    dependencies: [
        .package(
            name: "CocoaLumberjack",
            url: "https://github.com/CocoaLumberjack/CocoaLumberjack.git",
            from: "3.6.1"),
    ],
    targets: [
        .target(
              name: "LoggerTarget",
              dependencies: [.target(name: "LoggerWrapper",
                                     condition: .when(platforms: [.iOS]))]
            ),
        .target(
              name: "LoggerWrapper",
              dependencies: [
                .target(name: "Logger", condition: .when(platforms: [.iOS])),
                .product(name: "CocoaLumberjack", package: "CocoaLumberjack")
              ]
            ),
        .binaryTarget(name: "Logger", url: "https://mypath.com/Logger.xcframework.zip", checksum: "mychecksum")
    ]
)
Run Code Online (Sandbox Code Playgroud)

我可以通过 Swift 包管理器添加 Swift 包,但是当我尝试导入Logger模块时,出现构建错误:..../Logger.framework/Modules/Logger.swiftmodule/arm64-apple-ios.swiftinterface:4:8: No such module 'CocoaLumberjack'

有人可以帮我找出这里可能出现的问题吗?

错误 在此输入图像描述

XCFramework 代码快照供参考 在此输入图像描述

更新:

我已将 Logger.swift 中的导入更改为 @_implementationOnly 导入。现在生成的 .swiftinterface 文件中不包含“import CocoaLumberjack”,因此编译错误消失了。但是,应用程序崩溃,因为它仍在寻找 CocoaLumberjack.framework 但它不可用。'.../Library/Developer/Xcode/DerivedData/TestSPMApp-gfbagjtzjrrkjuathrrienvklwxs/Build/Products/Debug-iphonesimulator/CocoaLumberjack.framework/CocoaLumberjack' (no such file) CocoaLumberJack 作为 pod 依赖项添加到 Logger 框架中。看起来,在 Pods-Logger.xcconfig 文件中它引用了 CocoaLumberjack.framework。我相信这导致了现在的问题。

在此输入图像描述

小智 1

我认为这里真正的问题是依赖项不需要成为模块公共接口的一部分。您需要将import代码中的依赖项的所有实例替换为@_implementationOnly import

例如

@_implementationOnly import CocoaLumberjack

您可以@_implementationOnly 在这里阅读更多相关内容