Swift 包管理器,如何将包添加为开发依赖项?

Swift Package Manager, How to add a package as development dependency?

有没有办法添加一个 spm 包作为开发依赖?

例如,我们是否可以做一些事情,例如 developmentDependencies: { somePackage }

(就像我们可以在 npm、pub 等其他包管理器中轻松实现一样?)

没有,目前没有。这是我在 Swift Evolution forums 上看到过几次讨论的事情,这是我想要的事情,我实际上认为我已经看到了一些关于它发生的新闻,但是,唉,没有。

获得与现在相同效果的“最佳”方法是在进行发布构建时注释掉您的开发依赖项。测试后有一个工具叫Rocket that includes the hiding of dev dependencies as part of its release steps. I haven't used it, though, as I chose to write my own scripts instead. My example is my project DiceKit, where the Package.swift file does not include dev dependencies, and when my CI needs those dependencies, I run an include_dev_dependencies.py script before testing and a remove_dev_dependencies.py

这种方法肯定不理想,可能不适合你,但我希望你能想出点办法。祝你好运!

实际上,我可以确认1 Swift 5.2 这是可能的。 SE-0226 定义“基于目标的依赖项解析”,这基本上意味着 SPM 将只下载您使用的目标实际需要的依赖项。

例如:

// swift-tools-version:5.2
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "SwiftlySearch",
    platforms: [
        .iOS(.v13)
    ],
    products: [
        .library(
            name: "SwiftlySearch",
            targets: ["SwiftlySearch"]
        ),
    ],
    dependencies: [
        .package(url: "https://github.com/nalexn/ViewInspector.git", from: "0.4.3")
    ],
    targets: [
        .target(
            name: "SwiftlySearch",
            dependencies: []
        ),
        .testTarget(
            name: "SwiftlySearchTests",
            dependencies: ["SwiftlySearch", "ViewInspector"]
        ),
    ]
)

这只会为目标“SwiftlySearchTests”下载 ViewInspector,不会 为已发布的库 SwiftlySearch。

TL;DR:只需在使用它们的目标上声明依赖关系,SPM 会找出其余部分。


1 我刚刚使用 Xcode 11.6 中的内置包管理器对此进行了测试,其表现符合预期。