Swift Package Manager(SPM)描述文件主要是 Package.swift,它定义了 Swift 包的配置和依赖。这个文件使用 Swift 语言编写,主要字段包括:

name

  • 类型: String
  • 描述: 包的名称。

platforms

  • 类型: [SupportedPlatform]
  • 描述: 声明包支持的平台及其最低版本。

products

  • 类型: [Product]
  • 描述: 包产出的产品,主要是库或可执行文件。

dependencies

  • 类型: [Package.Dependency]
  • 描述: 声明包的依赖项。

targets

  • 类型: [Target]
  • 描述: 包包含的模块或测试模块。

swiftLanguageVersions

  • 类型: [SwiftVersion]
  • 描述: 包支持的 Swift 语言版本。

cLanguageStandard, cxxLanguageStandard

  • 类型: String
  • 描述: 包使用的 C 和 C++ 语言标准。

字段详细说明:

platforms

用于声明支持的平台及其最低版本。示例:

.platforms: [
    .macOS(.v10_15),
    .iOS(.v13),
    .tvOS(.v13),
    .watchOS(.v6)
]

products

定义包产生的产品。示例:

.products: [
    .library(name: "MyLibrary", targets: ["MyLibrary"]),
    .executable(name: "MyExecutable", targets: ["MyExecutable"])
]

dependencies

声明包依赖的其他包。示例:

.dependencies: [
    .package(url: "https://github.com/apple/swift-argument-parser", from: "1.0.0")
]

targets

定义包内的模块。示例:

.targets: [
    .target(name: "MyLibrary", dependencies: []),
    .testTarget(name: "MyLibraryTests", dependencies: ["MyLibrary"])
]

swiftLanguageVersions

声明支持的 Swift 版本。示例:

.swiftLanguageVersions: [.v5]

完整示例:

// swift-tools-version:5.3
import PackageDescription

let package = Package(
    name: "MyPackage",
    platforms: [
        .macOS(.v10_15),
        .iOS(.v13)
    ],
    products: [
        .library(
            name: "MyLibrary",
            targets: ["MyLibrary"]),
        .executable(
            name: "MyExecutable",
            targets: ["MyExecutable"]),
    ],
    dependencies: [
        .package(url: "https://github.com/apple/swift-argument-parser", from: "1.0.0"),
    ],
    targets: [
        .target(
            name: "MyLibrary",
            dependencies: []),
        .target(
            name: "MyExecutable",
            dependencies: [
                .product(name: "ArgumentParser", package: "swift-argument-parser"),
            ]),
        .testTarget(
            name: "MyLibraryTests",
            dependencies: ["MyLibrary"]),
    ],
    swiftLanguageVersions: [.v5]
)

这涵盖了 Swift Package Manager 描述文件的主要字段和用法。

App 的依赖和一个模块的描述,他们的 Package.swift 有什么区别?

在使用 Swift Package Manager 编写 Package.swift 文件时,针对应用(App)的依赖和模块(Library/Framework)的描述存在一些关键区别。这些区别主要体现在文件结构、产品类型和依赖项的声明上。

App 的 Package.swift

应用程序的 Package.swift 文件通常用于描述整个应用及其所有依赖项。它会指定应用的可执行产品(Executable)和相关的依赖包。示例:

// swift-tools-version:5.3
import PackageDescription

let package = Package(
    name: "MyApp",
    platforms: [
        .macOS(.v10_15),
        .iOS(.v13)
    ],
    products: [
        .executable(
            name: "MyAppExecutable",
            targets: ["MyApp"]),
    ],
    dependencies: [
        .package(url: "https://github.com/apple/swift-argument-parser", from: "1.0.0"),
        .package(url: "https://github.com/Alamofire/Alamofire", from: "5.2.0"),
    ],
    targets: [
        .target(
            name: "MyApp",
            dependencies: [
                .product(name: "ArgumentParser", package: "swift-argument-parser"),
                "Alamofire"
            ]),
    ],
    swiftLanguageVersions: [.v5]
)

主要区别:

  1. 产品类型:
  • products 定义了一个可执行产品(Executable),这是一个应用程序的二进制输出。
  1. 依赖项:
  • dependencies 列表包含了应用所需的所有外部包。依赖项声明在顶层。
  1. 目标(Targets):
  • targets 定义了一个主目标,该目标依赖于其他包,并包含应用的主要代码。

模块(Library)的 Package.swift

模块(库/框架)的 Package.swift 文件通常用于描述库的配置及其依赖项。它会指定库产品(Library)和相关的依赖包。示例:

// swift-tools-version:5.3
import PackageDescription

let package = Package(
    name: "MyLibrary",
    platforms: [
        .macOS(.v10_15),
        .iOS(.v13)
    ],
    products: [
        .library(
            name: "MyLibrary",
            targets: ["MyLibrary"]),
    ],
    dependencies: [
        .package(url: "https://github.com/AnotherLibrary/AnotherLibrary", from: "1.0.0"),
    ],
    targets: [
        .target(
            name: "MyLibrary",
            dependencies: ["AnotherLibrary"]),
        .testTarget(
            name: "MyLibraryTests",
            dependencies: ["MyLibrary"]),
    ],
    swiftLanguageVersions: [.v5]
)

主要区别:

  1. 产品类型:
  • products 定义了一个库产品(Library),这是一个模块的二进制输出,供其他代码使用。
  1. 依赖项:
  • dependencies 列表包含了模块所需的所有外部包。依赖项声明在顶层。
  1. 目标(Targets):
  • targets 定义了多个目标,包括库的主目标和测试目标。测试目标依赖于库的主目标。

总结

  • AppPackage.swift 文件重点在于描述整个应用及其所有依赖项,主要输出为可执行文件。
  • 模块(Library)Package.swift 文件重点在于描述模块的配置及其依赖项,主要输出为库文件,并可能包含测试目标。

这两种描述文件在结构和内容上有一些相似之处,但它们的目标和用途有所不同。

SPM 官方链接