Swift 包管理器的奇怪依赖问题

Strange Dependency Issue With Swift Package Manager

更新: 我给了它几天,没有答案,所以我将开始修改回购协议,努力解决问题(我最终会解决的)。

我绝对确定“我没有正确把握”,但我无法诊断问题。

I have also made a similar post on the Swift Forums.

我有this package, which is consumed by this package, which is, in turn, consumed by this app. The first package is also consumed by this package, which is also consumed by the app。该链条工作正常,但也简单得多。

问题是我在 the RVS_BlueThoth package during the BlueVanClef 构建中遇到错误。

错误与the RVS_Generic_Swift_Toolbox package not building in the RVS_BlueThoth package build (the module is not available), but I can't figure out why. There is nothing but a blank serialized diagnostics file for one of the files that consumes the RVS_Generic_Swift_Toolbox模块一致,除文件不存在外没有其他错误。

如果我构建 the RVS_BlueThoth package independently, I have no issues, but including it in the BlueVanClef app 始终报告此错误。

就像我说的,我确定问题出在我身上。我就是不知道怎么去。

感谢您的帮助!

(例如,是否有任何可用于 SPM 的诊断实用程序?)

这是依赖关系图:

注意 RVS_BlueThoth 和 RVS_Persistent_Prefs 之间的虚线。那是因为该依赖项仅用于测试工具,Blue Van Clef 未使用它。

这是各种 Package.swift 文件:

RVS_Generic_Swift_Toolbox:

// swift-tools-version:5.2

import PackageDescription

let package = Package(
    name: "RVS_Generic_Swift_Toolbox",
    platforms: [
        .iOS(.v11),
        .tvOS(.v11),
        .macOS(.v10_14),
        .watchOS(.v5)
    ],
    products: [
        .library(
            name: "RVS-Generic-Swift-Toolbox",
            type: .dynamic,
            targets: ["RVS_Generic_Swift_Toolbox"])
    ],
    targets: [
        .target(
            name: "RVS_Generic_Swift_Toolbox",
            path: "./src")
    ]
)

RVS_Persistent_Prefs(这个有效):

// swift-tools-version:5.2
import PackageDescription

let package = Package(
    name: "RVS_Persistent_Prefs",
    platforms: [
        .iOS(.v11),
        .tvOS(.v11),
        .macOS(.v10_14),
        .watchOS(.v5)
    ],
    products: [
        .library(
            name: "RVS-Persistent-Prefs",
            type: .dynamic,
            targets: ["RVS_Persistent_Prefs"])
    ],
    dependencies: [
        .package(
            url: "git@github.com:RiftValleySoftware/RVS_Generic_Swift_Toolbox.git",
            from: "1.2.1"
        )
    ],
    targets: [
        .target(
            name: "RVS_Persistent_Prefs",
            path: "./src")
    ]
)

RVS_BlueThoth(这个不行):

// swift-tools-version:5.2
import PackageDescription

let package = Package(
    name: "RVS_BlueThoth",
    platforms: [
        .iOS(.v11),
        .tvOS(.v11),
        .macOS(.v10_14),
        .watchOS(.v5)
    ],
    products: [
        .library(
            name: "RVS-BlueThoth",
            type: .dynamic,
            targets: ["RVS_BlueThoth"]
        )
    ],
    dependencies: [
        .package(
            url: "git@github.com:RiftValleySoftware/RVS_Generic_Swift_Toolbox.git",
            from: "1.2.1"
        ),
        .package(
            url: "git@github.com:RiftValleySoftware/RVS_PersistentPrefs.git",
            from: "1.1.1"
        )
    ],
    targets: [
        .target(
            name: "RVS_BlueThoth",
            path: "./src/Source"
        )
    ]
)

好的。解决了。终于。

我的确是“看错了”,但也不好说。

最好的调试方法是 cd 到包目录,然后执行 swift build。这帮助我看到了错误的发生(它们没有反映在 Xcode 日志中)。

问题是我需要在 两个 地方做依赖。我只有一个。现在回想起来,它是一个相当自然的结构,但由于我需要重命名依赖项的产品以使用破折号而不是下划线这一事实而变得复杂。

这已通过将 RVS_BlueThoth Package.swift 文件更改为这样解决:

// swift-tools-version:5.2

import PackageDescription

let package = Package(
    name: "RVS_BlueThoth",
    platforms: [
        .iOS(.v11),
        .tvOS(.v11),
        .macOS(.v10_14),
        .watchOS(.v5)
    ],
    products: [
        .library(name: "RVS-BlueThoth", type: .dynamic, targets: ["RVS_BlueThoth"])
    ],
    dependencies: [
        .package(name: "RVS_Generic_Swift_Toolbox", url: "git@github.com:RiftValleySoftware/RVS_Generic_Swift_Toolbox.git", from: "1.2.1")
    ],
    targets: [
        .target(
            name: "RVS_BlueThoth",
            dependencies: [.product(name: "RVS-Generic-Swift-Toolbox", package: "RVS_Generic_Swift_Toolbox")],
            path: "./src/Source"
        )
    ]
)

射中的钱是这条线:

dependencies: [.product(name: "RVS-Generic-Swift-Toolbox", package: "RVS_Generic_Swift_Toolbox")]

请注意,name 参数是 "RVS-Generic-Swift-Toolbox",而不是 "RVS_Generic_Swift_Toolbox",但是包名称有下划线(我可能可以在没有 name 参数的情况下全局依赖列表)。

那是因为.

我还能够稍微简化依赖链,因为一些依赖项仅用于测试工具。

更新: 我想说的是,对我来说,错误响应来自swift build 命令。太棒了。它实际上有我需要使用的代码。正是这个回应告诉我,我需要使用破折号和下划线。那不是我理解的东西。