Swift Package Manager¶
Swift Package Manager(SPM) 用于构建项目的源代码和依赖项。由于 Vapor 严重依赖 SPM,因此最好了解其工作原理。
SPM 与 Cocoapods,Ruby gems 和 NPM 相似。你可以在命令行中将 SPM 与 swift build
、swift test
等命令或兼容的 IDE 结合使用。但是,与其他软件包管理器不同,SPM 软件包没有中央软件包索引。SPM 使用 Git 标签 和 URL 来获取 Git 存储库和依赖版本。
Package Manifest¶
SPM 在项目中查找的第一项是 package 清单。它应始终位于项目的根目录中,并命名为 Package.swift
。
看一下这个示例:
// swift-tools-version:5.2
import PackageDescription
let package = Package(
name: "app",
platforms: [
.macOS(.v10_15)
],
products: [
.executable(name: "Run", targets: ["Run"]),
.library(name: "App", targets: ["App"]),
],
dependencies: [
.package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"),
],
targets: [
.target(name: "App", dependencies: [.product(name: "Vapor", package: "vapor")]),
.target(name: "Run", dependencies: ["App"]),
.testTarget(name: "AppTests", dependencies: ["App"])
]
)
下面将对这段代码的各部分进行说明。
Tools Version¶
第一行表示需要使用的 Swift tools 版本号,它指明了 Swift 的最低可用版本。Package 描述 API 可能随着 Swift 版本而改变,所以这一行将让 Swift 确认怎么去解析你的配置文件。
Package Name¶
Package
的第一个参数代表当前 package 的名字。如果软件包是公共的,你应该使用 Git 存储库的 URL 的最后一段作为名称
Platforms¶
platforms
数组指定此程序包支持的平台和版本。通过指定 .macOS(.v10_14)
,说明此软件包需要 macOS Mojave 或更高版本。 Xcode 加载该项目时,它将最低部署版本设置为 10.14,以便你可以使用所有可用的 API。
Products¶
products 字段代表 package 构建的时候要生成的 targets。示例中,有两个 target,一个是库,另一个是可执行文件。
Dependencies¶
dependencies 字段代表项目需要依赖的 package。所有 Vapor 应用都依赖 Vapor package ,但是你也可以添加其它想要的依赖库。
如上面这个示例,vapor/vapor 4.0 或以上版本是这个 package 的 dependency。当在 package 中添加了 dependency 后,接下来你必须设置是哪个 targets 依赖了新的可用模块。
Targets¶
Targets 是你的 package 里包含 modules、executables 以及 tests 总和。虽然可以添加任意多的 targets 来组织代码,但大部分 Vapor 应用有 3 个 target 就足够了。每个 target 声明了它依赖的 module。为了在代码中可以 import 这些 modules ,你必须在这里添加 module 名字。一个 target 可以依赖于工程中其它的 target 或者任意你添加在 dependencies 数组中且暴露出来的 modules。
建议
可运行 targets(包含 main.swift
文件的 target)不能被其它 modules 导入。这就是为什么 Vapor 会有 App
和 Run
两种 target。任何包含在 App 中的代码都可以在 AppTests
中被测试验证。
目录结构¶
以下是典型的 SPM package 目录结构。
.
├── Sources
│ ├── App
│ │ └── (Source code)
│ └── Run
│ └── main.swift
├── Tests
│ └── AppTests
└── Package.swift
每个 .target
对应 Sources
中的一个文件夹。
每个 .testTarget
对应 Tests
中的一个文件夹。
Package.resolved¶
第一次构建成功后,SPM 将会自动创建一个 Package.resolved
文件。Package.resolved
保存了当前项目所有用到的依赖库版本。下一次当你构建你的项目时将会同样的版本,甚至是这些依赖有更新的版本时也不会使用。
更新依赖, 运行 swift package update
.
Xcode¶
如果使用 Xcode 11 或更高版本,则在修改 Package.swift
文件时,将自动更改 dependencies、targets、products 等。
如果要更新到最新的依赖项,请使用 File → Swift Packages → 更新到最新的 Swift Package 版本。
你可能还想将 .swiftpm
文件添加到你的 .gitignore
文件中(Xcode 在此处存储 Xcode 项目配置)。