2.1 创建 Swift 包

原文链接: https://docs.swift.org/latest/documentation/packagemanagerdocs/creatingswiftpackage/

2.1 创建 Swift 包

把可执行代码或可共享的代码打包成一个独立的 Swift 包。

概述

Swift 包是一个目录,其中包含源代码、依赖,并且根目录下有一个 Package.swift 清单文件。Swift 包可以提供库、可执行文件、测试、插件和宏。包清单定义了包里有什么,它本身也是用 Swift 编写的。PackageDescription 的 API 参考定义了组装包清单时用到的类型、属性和函数。

创建库包

Swift 包管理器支持用 swift package init 创建包。默认情况下,包管理器创建的是以提供库为中心的包结构。例如,你可以创建一个目录并运行 swift package init 命令来创建一个包:

1
2
3
$ mkdir MyPackage
$ cd MyPackage
$ swift package init

生成的结构遵循包管理器的约定,并提供一个可直接运行的示例。除包清单之外,Swift 源代码按目标名收集在 Sources 目录下,测试也按目标名收集在 Tests 目录下:

├── Package.swift
├── Sources
│   └── MyPackage
│       └── MyPackage.swift
└── Tests
    └── MyPackageTests
        └── MyPackageTests.swift

你可以立刻使用 swift build 和 swift test:

1
2
$ swift build
$ swift test

创建可执行文件包

Swift Package Manager 也可以创建一个以生成可执行文件为中心的简化结构包。例如,创建一个目录并用 --type executable 选项运行 init 命令,就能得到一个提供 “Hello World” 可执行文件的包:

1
2
3
4
5
$ mkdir MyExecutable
$ cd MyExecutable
$ swift package init --type executable
$ swift run
Hello, World!

还有一个额外选项可以创建基于 swift-argument-parser 的命令行可执行文件,便于解析命令行参数并组织命令:在 swift package init 中把 type 选项设为 tool。与 executable 模板一样,它可直接运行,同样会打印 “Hello World”。

创建宏包

Swift Package Manager 可以为自定义宏生成样板代码:

1
2
3
4
5
6
$ mkdir MyMacro
$ cd MyMacro
$ swift package init --type macro
$ swift build
$ swift run
The value 42 was produced by the code "a + b"

这会创建一个包含下列内容的包:

  • 一个 .macro 类型目标,以及对 swift-syntax 的必要依赖;
  • 一个包含宏代码的库 .target;
  • 一个用于运行该宏的 .executableTarget;
  • 一个用于测试宏实现的 .testTarget。

note:.testTarget 不能依赖另一个 .testTarget。绕过这一限制的做法是为测试目标创建一个非测试目标供其依赖。如果把"仅供测试"的目标添加为非测试目标的依赖,就会出现运行时错误(示例见下)。

dyld[67034]: Library not loaded: @rpath/libTesting.dylib
Referenced from: <30F1D85A-75C7-358C-B169-96E34550501C> /Users/jappleseed/git/swiftlang/swift-package-manager-3/.build/out/Products/Debug/swift-package
Reason: tried: '/usr/lib/swift/libTesting.dylib' (no such file, not in dyld cache), '/System/Volumes/Preboot/Cryptexes/OS/usr/lib/swift/libTesting.dylib' (no such file), '/Users/jappleseed/git/swiftlang/swift-package-manager-3/.build/out/Products/Debug/libTesting.dylib' (no such file), '/Users/jappleseed/git/swiftlang/swift-package-manager-3/.build/out/Products/Debug/PackageFrameworks/libTesting.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/Users/jappleseed/git/swiftlang/swift-package-manager-3/.build/out/Products/Debug/PackageFrameworks/libTesting.dylib' (no such file), '/Users/jappleseed/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-04-01-a.xctoolchain/usr/lib/swift-6.2/macosx/libTesting.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/Users/jappleseed/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-04-01-a.xctoolchain/usr/lib/swift-6.2/macosx/libTesting.dylib' (no such file), '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-6.2/macosx/libTesting.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-6.2/macosx/libTesting.dylib' (no such file), '/usr/lib/swift/libTesting.dylib' (no such file, not in dyld cache), '/System/Volumes/Preboot/Cryptexes/OS/usr/lib/swift/libTesting.dylib' (no such file), '/Users/jappleseed/git/swiftlang/swift-package-manager-3/.build/out/Products/Debug/libTesting.dylib' (no such file), '/Users/jappleseed/git/swiftlang/swift-package-manager-3/.build/out/Products/Debug/PackageFrameworks/libTesting.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/Users/jappleseed/git/swiftlang/swift-package-manager-3/.build/out/Products/Debug/PackageFrameworks/libTesting.dylib' (no such file), '/Users/jappleseed/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-04-01-a.xctoolchain/usr/lib/swift-6.2/macosx/libTesting.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/Users/jappleseed/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2026-04-01-a.xctoolchain/usr/lib/swift-6.2/macosx/libTesting.dylib' (no such file), '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-6.2/macosx/libTesting.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-6.2/macosx/libTesting.dylib' (no such file)

示例宏 StringifyMacro 记录在 Swift Evolution 关于表达式宏的提案以及 WWDC Write Swift macros 视频中。更多文档参见《The Swift Programming Language》一书中的宏一章。