Swift Package Manager,如何将软件包添加为开发依赖项?

时间:2020-07-09 06:44:22

标签: swift swift-package-manager

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

例如,有一种方法可以做类似developmentDependencies: { somePackage }之类的事情。

(就像我们可以在其他软件包管理器(如npm,pub等)中轻松实现的那样?)

2 个答案:

答案 0 :(得分:1)

不,目前没有。这是我在Swift Evolution forums上讨论过的几次,这是我想要的,我实际上以为我已经看到了一些有关它发生的消息,可惜,没有。

获得与现在相同效果的“最佳”方法是在进行发行版本构建时注释掉您的开发依赖项。有一个名为Rocket的工具,其中包括隐藏开发依赖项作为其发布步骤的一部分。不过,我没有使用它,因为我选择编写自己的脚本。我的示例是我的项目DiceKit,其中的Package.swift文件不包含开发依赖关系,并且当我的CI需要这些依赖关系时,我在测试前运行include_dev_dependencies.py脚本和{{3} }。

这种方法绝对不是理想的方法,可能对您不起作用,但是我希望您能找到解决办法。祝你好运!

答案 1 :(得分:1)

实际上,我可以从Swift 5.2开始确认 1 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中的内置程序包管理器对其进行了测试,其表现与预期的一样。