Sourcery for Swift:代码生成完整指南
\n\n1. 这是什么?为什么需要它?
\nSourcery 是 Swift 语言的一个强大代码生成工具,由 Krzysztof Zabłocki 及其团队创建。它能够基于注释和源文件的结构自动生成样板代码(boilerplate code)。您无需手动编写重复的协议实现、Equatable、Hashable、Codable、测试用的 mock 对象或 Auto Layout 相关代码,只需一次性定义生成规则,Sourcery 便会完成其余工作。
\n\n为什么需要它?在实际的 Swift 项目中,大量代码是机械且重复的。这不仅耗费开发者的时间,也是错误的来源:例如忘记在 Equatable 中添加新字段,就会导致 bug。Sourcery 通过接管这些繁琐工作来解决此问题。它分析您的代码(AST——抽象语法树),并基于模板(Stencil 或基于 Swift 的模板)生成新文件。这在拥有数十甚至数百个模型、ViewController 或服务的大型项目中尤为有用。
Sourcery 并非运行时库——它是一个编译时工具。您将其作为构建过程的一部分运行(通过 Xcode 的 Build Phase 或通过 SPM/Tuist),它会生成文件,然后这些文件与其余代码一起编译。这种方法保证了零运行时开销和完全的可预测性。
\n\n2. 安装
\n安装 Sourcery 有多种方式。最简单且推荐的方式是通过 Homebrew:
\nbrew install sourcery\n\n对于使用 Swift Package Manager (SPM) 的项目,可以将 Sourcery 作为插件添加。但更常见的是将其作为独立的二进制文件,从构建脚本中调用。通过 Mint(Swift 工具的包管理器)安装:
\nmint install krzysztofzablocki/Sourcery\n\n您也可以从 GitHub Releases 下载预编译的二进制文件,并将其放入项目文件夹。安装后,请确保命令可用:
\nsourcery --version\n\n3. 快速入门——最小工作示例
\n让我们创建一个简单示例:为结构体自动生成 Equatable 协议的实现。
步骤 1:创建源代码文件(例如 Sources/Models/User.swift):
import Foundation\n\n// sourcery: AutoEquatable\nstruct User {\n let id: Int\n let name: String\n let email: String\n}\n\n注意注释 // sourcery: AutoEquatable——这是一个注解,告诉 Sourcery 需要为该结构体生成 Equatable 实现。
步骤 2:创建模板(例如 Templates/AutoEquatable.stencil):
// Generated by Sourcery\n// swiftlint:disable all\n\n{% for type in types.all where type.annotations.AutoEquatable %}\nextension {{ type.name }}: Equatable {\n static func == (lhs: {{ type.name }}, rhs: {{ type.name }}) -> Bool {\n {% for variable in type.storedVariables %}\n {% if not forloop.first %} && {% endif %}lhs.{{ variable.name }} == rhs.{{ variable.name }}\n {% endfor %}\n }\n}\n{% endfor %}\n\n步骤 3:运行 Sourcery:
\nsourcery --sources Sources/Models --templates Templates --output Generated\n\n步骤 4:结果——在 Generated 文件夹中会生成文件 AutoEquatable.generated.swift:
// Generated by Sourcery\