Swift 包管理器 - 排除依赖

Swift Package Manager - Exclude dependency

我正在重新考虑在 SPM 中使用多个产品。事情是这样的。

我会在包装中提供两种产品。一个是“工具”,另一个是“工具网络”。 第一个有一些 swift 类,没什么特别的,完全没有依赖关系。 第二个也有一些 swift 逻辑,但依赖于 Alamofire 库。

配置如下:

// swift-tools-version:5.1
import PackageDescription

let package = Package(
  name: "Tool",
  platforms: [.iOS(.v11)],
  products: [
    .library(name: “Tool", targets: [“Tool"]),
    .library(name: “ToolNetworking", targets: [“ToolNetworking"])
  ],
  dependencies: [
    .package(url: "https://github.com/Alamofire/Alamofire.git", .exact("5.1.0"))
  ],
  targets: [
    .target(
      name: "Tool",
      path: "Sources",
      exclude: ["Networking"]
    ),
    .target(
      name: "ToolNetworking",
      dependencies: ["Tool", "Alamofire"],
      path: "Sources",
      sources: ["Networking"]
    )
  ],
  swiftLanguageVersions: [.v5]
)

当我要安装软件包时,我可以在两者之间进行选择。如果我 select ToolNetworking,它也会安装 Alamofire 依赖。

对于 Tool 产品,我只希望 SPM 安装我的代码,没有依赖项。这是我的问题。如果我只安装 Tool 产品,因为我没有定义 dependencies 字段,如何排除 Alamofire

谢谢

第一步是升级到 Swift 5.2。 Swift 随 Swift 5.2 一起提供的包管理器开始执行此行为(如 SE-0226 中所述)。

但是,由于尚未完全实施,Xcode 可能仍会查看 Alamofire。不过,它最终不应该 link 它。因此,如果您只使用 Tool 产品,生成的二进制文件中不会有任何 Alamofire 的痕迹:-)