首页 > 解决方案 > Swift 包管理器 - 排除依赖

问题描述

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

我将在包装中提供两种产品。一个是“工具”,另一个是“工具网络”。第一个有一些 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]
)

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

对于Tool产品,我只希望 SPM 安装我的代码,没有依赖项。这是我的问题。由于我没有定义字段,所以我Alamofire只安装产品时如何排除?Tooldependencies

谢谢

标签: iosswiftdependenciesswift-package-manager

解决方案


第一步是升级到 Swift 5.2。Swift 5.2 附带的 Swift 包管理器开始实现这种行为(如SE-0226中所述)。

然而,由于它还没有完全实现,Xcode 可能仍然会检查 Alamofire。但是,它最终不应该链接它。因此,如果您只使用该Tool产品,则生成的二进制文件中不会有任何 Alamofire 痕迹 :-)


推荐阅读