版本管理、冲突解决与 Swift 插件
管理版本范围、解决依赖冲突,并使用构建工具插件。
版本管理、冲突解决与 Swift 插件 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
SPM 中的语义化版本控制
SPM 使用语义化版本控制:MAJOR.MINOR.PATCH。使用 from:、exact: 或 .upToNextMajor 声明版本要求。
.package(url: "https://github.com/apple/swift-log", from: "1.5.0"),
.package(url: "https://github.com/vapor/vapor", exact: "4.83.0"),
.package(url: "https://github.com/pointfreeco/swift-composable-architecture",
.upToNextMajor(from: "1.0.0"))Package.resolved
Package.resolved 会固定所有依赖项的确切版本。对于应用,请提交此文件;对于库,请省略此文件。
// Package.resolved (auto-generated):
// Pins exact commit hash and version for every dependency
// Run "swift package update" to update pinned versions解决版本冲突
当两个包要求同一依赖项的不同版本时,SPM 会尝试找到兼容的版本。无法解决的冲突会导致构建错误。
// PackageA requires Logging 1.4.0
// PackageB requires Logging 1.5.0
// SPM resolves to 1.5.0 (satisfies both >= 1.x)
// Conflict: PackageA requires Logging 1.x, PackageB requires 2.x强制指定版本
将发生冲突的依赖项直接添加到应用的 Package.swift 中,以覆盖 SPM 原本会选择的版本。
// Force Logging 1.5.0 by declaring it directly:
.package(url: "https://github.com/apple/swift-log", exact: "1.5.0")构建工具插件
构建工具插件会在构建期间运行,以自动生成源代码、处理资源或运行代码检查工具。
// In Package.swift:
.plugin(
name: "SourceGenerator",
capability: .buildTool()
)实现构建工具插件
构建工具插件遵循 BuildToolPlugin,并返回 BuildCommand 或 PrebuildCommand。
import PackagePlugin
@main
struct SourceGenerator: BuildToolPlugin {
func createBuildCommands(context: PluginContext, target: Target) async throws -> [Command] {
let output = context.pluginWorkDirectory.appending("Generated.swift")
return [.buildCommand(
displayName: "Generating sources",
executable: try context.tool(named: "gen-tool").path,
arguments: ["--output", output],
outputFiles: [output]
)]
}
}命令插件
命令插件可以从 Xcode 或 CLI 按需运行,适合用于格式化、代码检查或生成文档。
// In Package.swift:
.plugin(
name: "FormatPlugin",
capability: .command(intent: .sourceCodeFormatting())
)运行命令插件
您可以从终端或 Xcode 的右键菜单执行命令插件。
// CLI:
swift package plugin format-source-code
// Xcode: right-click target → "Format Source Code"将 SwiftLint 用作构建插件
SwiftLint 以 SPM 插件的形式提供,会在每次构建时自动运行。
.package(url: "https://github.com/realm/SwiftLint", from: "0.54.0"),
// In target:
.plugin(name: "SwiftLintBuildToolPlugin", package: "SwiftLint")插件沙盒
插件在具有受限文件系统访问权限的沙盒中运行,以确保安全。它们只能写入指定的工作目录。
// Accessible from plugins:
// context.pluginWorkDirectory — writable work dir
// context.package.directory — read-only source
// target.sourceFiles — source file list快速检查
Package.resolved 在 Swift 包中的作用是什么?
课程回顾
在 Package.swift 中使用语义化版本范围。对于应用,请提交 Package.resolved,以实现可复现的构建。通过直接声明依赖项来解决版本冲突。构建工具插件会在构建期间自动运行(代码检查工具、代码生成器)。命令插件按需运行。插件会受到沙盒保护,以确保安全。
常见问题解答
「版本管理、冲突解决与 Swift 插件」课时是免费的吗?
是的 — 「版本管理、冲突解决与 Swift 插件」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「版本管理、冲突解决与 Swift 插件」这节课中我会学到什么?
管理版本范围、解决依赖冲突,并使用构建工具插件。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「版本管理、冲突解决与 Swift 插件」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Package.swift:目标、产品与依赖
- 本地包与功能模块
- 二进制目标与 XCFramework
- 版本管理、冲突解决与 Swift 插件