掌握 Swift Package Manager

3,617 阅读1分钟

内容来自 Chat-GPT-4.0 整理

Swift Package Manager(简称SPM)是一款强大的 Swift 语言包管理工具,它被设计出来用于自动化 Swift 代码的获取、编译和链接过程。从 Swift 3.0 开始,SPM 被默认集成在 Swift 语言中。

创建包

Xcode 14创建

在 Xcode 的菜单栏中选择 "File"(文件)> "New"(新建)> "Package..."(包...)。

命令行创建

使用 Swift Package Manager 创建新的 Swift 包相当简单,只需要运行 swift package init 命令即可:

$ mkdir <package name>
$ cd <package name>
$ swift package init --type library

上述命令会创建一个新的库类型的 Swift 包,包名就是目录名。

Swift 包的基本结构

创建后的 Swift 包通常会有以下结构:

 MyPackage
    ├── Package.swift
    ├── Sources
       └── MyPackage
           ├── File1.swift
           └── File2.swift
    └── Tests
        └── MyPackageTests
            ├── File1Tests.swift
            └── File2Tests.swift

这里主要包含三个部分:

  • Package.swift:这是 Swift 包的配置文件,其中定义了包的名称、产品、依赖项等信息。
  • Sources:这个目录包含了 Swift 包的源代码。
  • Tests:这个目录包含了 Swift 包的测试代码。

配置依赖

Package.swift 文件中,我们可以声明当前包依赖的其他 Swift 包。例如:

let package = Package(
        name: "Example",
        dependencies: [
            .package(url: "https://github.com/anotherUser/anotherPackage.git", from: "1.2.3"),
        ],
        targets: [
            .target(
                name: "Example",
                dependencies: ["anotherPackage"]),
        ]
    )

在这个例子中,我们的 "Example" 包依赖于 "anotherPackage",它的源代码托管在 GitHub 上。

细说 Package.swift 文件

Package.swift 是一个包描述文件,这里面定义了包的一些基本信息,如包的名称,产品,依赖项等。它使用 Swift 语言编写。

Package.swift 文件中,通常会首先声明 Swift tools 的版本,这决定了 Package Manager 的行为和功能。例如:

// swift-tools-version:5.3

上面的代码声明了使用 Swift 5.3 版本的工具。

接下来,我们需要导入 PackageDescription 模块,它提供了构建 Package.swift 所需要的所有数据类型:

import PackageDescription

然后,我们需要创建一个 Package 对象,它是 Package.swift 文件的核心部分:

let package = Package(
    //...
)

Package 对象中,我们可以定义以下内容:

  • name:这是你的包的名称。
  • platforms:这定义了你的包支持的平台和版本。
  • products:这定义了你的包提供的产品。一个产品可以是一个库或一个可执行文件。
  • dependencies:这定义了你的包依赖的其他包。你需要提供每个依赖包的 URL 和版本。
  • targets:这定义了你的包的构建目标。每个目标可以依赖于源文件和其他目标。

以下是一个 Package.swift 的示例:

// swift-tools-version:5.3
import PackageDescription

let package = Package(
    name: "MyPackage",
    platforms: [
        .macOS(.v10_15),
    ],
    products: [
        .library(
            name: "MyPackage",
            targets: ["MyPackage"]),
    ],
    dependencies: [
        .package(url: "https://github.com/someone/somepackage.git", from: "1.0.0"),
    ],
    targets: [
        .target(
            name: "MyPackage",
            dependencies: ["SomePackage"]),
        .testTarget(
            name: "MyPackageTests",
            dependencies: ["MyPackage"]),
    ]
)

在这个例子中,我们定义了一个名为 "MyPackage" 的包,它在 macOS 10.15 及以上版本上运行,依赖于 "SomePackage",并提供一个名为 "MyPackage" 的库和一些测试。

解释 Package.swift 与项目目录的关系

在 Swift Package Manager 中,Package.swift 文件和项目目录的结构有着紧密的关系。

首先,Package.swift 文件通常位于项目的根目录。这个文件是 Swift Package 的描述文件,它定义了包的基本信息(如包的名称、产品和依赖等)。

除了 Package.swift 文件之外,Swift Package 通常还有以下目录结构:

  1. Sources:这个目录包含所有的 Swift 源代码文件。每个 target(目标)在 Sources 目录中都有一个对应的子目录。例如,如果你在 Package.swift 文件中定义了一个名为 "MyLibrary" 的 target,那么你应该在 Sources 目录下创建一个同名的 "MyLibrary" 子目录,然后将这个 target 的所有源代码文件放在这个子目录中。
  2. Tests:这个目录包含所有的测试代码。和 Sources 目录类似,每个测试 target 在 Tests 目录中也有一个对应的子目录。

因此,Package.swift 文件和目录结构是一一对应的。你在 Package.swift 文件中定义的每个 target,都应该在 SourcesTests 目录中有一个对应的子目录。

以下是一个典型的 Swift Package 的目录结构:

MyPackage
    ├── Package.swift
    ├── Sources
       └── MyPackage
           ├── File1.swift
           └── File2.swift
    └── Tests
        └── MyPackageTests
            ├── File1Tests.swift
            └── File2Tests.swift

在这个例子中,我们有一个名为 "MyPackage" 的包,它有一个同名的 target 和一个 "MyPackageTests" 的测试 target。每个 target 的源代码都位于其对应的子目录中。

构建和运行

要构建和运行 Swift 包,我们可以使用 Swift Package Manager 的 swift buildswift run 命令。例如,要构建你的包,可以在终端中运行:

$  swift build

测试

如果你的 Swift 包中包含了测试代码,可以使用 swift test 命令来运行这些测试:

$  swift test

总结

Swift Package Manager 是一个强大的工具,它能帮助我们更方便地管理 Swift 代码包,同时也使代码的分享和复用变得更加简单。掌握 SPM,你会发现在 Swift 开发中,无论是管理自己的代码,还是使用他人的代码,都变得非常方便。

对于更详细的信息和高级用法,你可以参考 Swift 官方文档Swift Package Manager 的 GitHub 页面