Project Icon

Sourcery

基于 SwiftSyntax 的代码生成工具

Sourcery 是基于 SwiftSyntax 的代码生成工具,广泛应用于 iOS 和 macOS 项目。它可以自动生成等式、Codable、一致的Mocks与 Stubs等样板代码,减少开发者的重复劳动,提高效率。支持多种安装方式,包括 Homebrew、CocoaPods 和 Swift Package Manager,有助于提高项目的一致性和减少人为错误。

macOS 13 ubuntu x86_64 docs Version License Platform

深入的Sourcery指南已包含在我的SwiftyStack工程课程中。

Sourcery Pro 提供了一个强大的 Stencil 编辑器,并扩展了 Xcode 的功能,可以处理实时 AST 模板:在 Mac App Store 上可用

https://user-images.githubusercontent.com/1468993/114271090-f6c19200-9a0f-11eb-9bd8-d7bb15129eb2.mp4

了解更多关于 Sourcery Pro 的信息

Sourcery 是一个针对 Swift 语言的代码生成器,建立在苹果的 SwiftSyntax 之上。它扩展了语言抽象,允许你自动生成样板代码。

它被用于超过 40,000 个 iOS 和 macOS 项目中,并且在一些最受欢迎和好评的应用程序(包括 Airbnb、Bumble、纽约时报)中发挥力量。它的大规模社区采用是推动苹果实现派生相等性和自动 Codable 符合性的因素之一。Sourcery 由一个不断增长的贡献者社区维护。

在你的下一个项目中试试 Sourcery 或将其添加到现有项目中 -- 你会节省很多时间并感到非常满意!

重点总结

Sourcery 允许你消除重复的代码,并创建更好的架构和开发人员工作流。一个例子可能是为所有协议实现 Mocks,没有 Sourcery,你需要为每个协议编写 数百行代码,如下所示:

class MyProtocolMock: MyProtocol {

    //MARK: - sayHelloWith
    var sayHelloWithNameCallsCount = 0
    var sayHelloWithNameCalled: Bool {
        return sayHelloWithNameCallsCount > 0
    }
    var sayHelloWithNameReceivedName: String?
    var sayHelloWithNameReceivedInvocations: [String] = []
    var sayHelloWithNameClosure: ((String) -> Void)?

    func sayHelloWith(name: String) {
        sayHelloWithNameCallsCount += 1
        sayHelloWithNameReceivedName = name
        sayHelloWithNameReceivedInvocations.append(name)
        sayHelloWithNameClosure?(name)
    }

}

而使用 Sourcery?

extension MyProtocol: AutoMockable {}

Sourcery 消除了编写任何 mock 代码的需求,那么在你的项目中有多少协议呢?想象一下你将节省多少时间,使用 Sourcery 还会使得每一个 mock 一致,如果你重构或添加属性,mock 代码会自动为你更新,消除了可能的人为错误。

Sourcery 可以应用于代码库中的任意问题,如果你能向他人描述一个算法,你就可以使用 Sourcery 自动化它。

最常见的用途有:

但是关于更具体的用例呢,比如自动生成你的应用 BetaSetting 的所有 UI?你也可以使用 Sourcery

一旦你开始编写自己的模板并学习 Sourcery 的功能,不久你就离不开它了。

如何开始

有许多关于 Sourcery 不同用途的教程,你也可以随时在我们的 Swift 论坛分类中寻求帮助。

快速 Mock 简介和入门视频

你还可以观看这段由 Inside iOS Dev 制作的快速入门和 Mock 简介视频:

观看视频

安装

  • 二进制形式

    发布标签 下载最新版本带有预编译的二进制文件。将压缩包解压缩到目标位置并运行 bin/sourcery

  • Homebrew

    brew install sourcery

  • CocoaPods

    pod 'Sourcery' 添加到你的 Podfile 并运行 pod update Sourcery。这将下载最新版本的二进制文件并将其放在项目的 CocoaPods 路径中,你可以用 $PODS_ROOT/Sourcery/bin/sourcery 来运行它。

    如果你只想安装 sourcery 二进制文件,你可能只想使用 CLI-Only 子规格: pod 'Sourcery', :subspecs => ['CLI-Only']

  • Mint

    mint run krzysztofzablocki/Sourcery

  • 从源码构建

    发布标签 下载最新版本的源代码或克隆仓库并手动构建 Sourcery。

    • 使用 Swift 包管理器构建

      在根目录运行 swift build -c release,然后将 .build/release/sourcery 复制到目标位置。

      注意:JS 模板在使用 SPM 构建时尚未支持。

    • 使用 Xcode 构建

      运行 xcodebuild -scheme sourcery -destination generic/platform=macOS -archivePath sourcery.xcarchive archive 并从归档文件中导出二进制文件。

  • SPM(仅用于插件用途) 将包依赖添加到你的 Package.swift 中,版本为 1.8.3

.package(url: "https://github.com/krzysztofzablocki/Sourcery.git", from: "1.8.3")
  • pre-commit 将依赖项添加到 .pre-commit-config.yaml
- repo: https://github.com/krzysztofzablocki/Sourcery
  rev: 1.9.1
  hooks:
  - id: sourcery

文档

最新版本的完整文档可以在这里找到。

Linux 支持

Linux 支持在此页面描述。

用法

运行可执行文件

Sourcery 是一个命令行工具,你可以手动运行它或在自定义生成阶段使用以下命令运行:

$ ./bin/sourcery --sources <sources path> --templates <templates path> --output <output path>

注意:此命令因你安装 Sourcery 的方式而异(见安装

Swift 包命令

Sourcery 现在可以用作 Swift 包命令插件。为此,必须将该包添加为你的 Swift 包或 Xcode 项目的依赖项(见上文安装)。

为了提供插件使用的配置,请在目标目录的根目录放置 .sourcery.yml 文件(在源文件夹而不是包的根目录)。

从命令行运行

要验证插件能否被 SwiftPM 查找到,请使用:

$ swift package plugin --list

要运行代码生成器,你需要允许对项目进行更改,使用 --allow-writing-to-package-directory 标志:

$ swift package --allow-writing-to-package-directory sourcery-command

在 Xcode 中运行

在使用此命令插件的项目/包内,右键点击项目并从 "SourceryPlugins" 菜单组中选择 "SourceryCommand"。

⚠️ 注意,这仅适用于 Xcode 14 及以上版本。

命令行选项

  • --sources - 源 swift 文件或目录的路径。你可以使用多个 --sources 选项提供多个路径。
  • --templates - 模板的路径。文件或目录。你可以使用多个 --templates 选项提供多个路径。
  • --force-parse - 生成文件的后缀名,你想要解析的 Sourcery 生成文件。你可以使用多个 --force-parse 选项提供多个后缀。(例如,如果使用 --force-parse toparse,即使由 Sourcery 生成的 file.toparse.swift 也会被解析)尝试实现多阶段生成时很有用。--force-parse 还可以用于处理 sourcery 注解内的内容。比如要处理 sourcery:inline:auto:Type.AutoCodable 注解内的代码,你可以使用 --force-parse AutoCodable
  • --output [默认: 当前路径] - 输出路径。文件或目录。
  • --config [默认: 当前路径] - 配置文件的路径。文件或目录。详见 配置文件
  • --args - 传递给模板的额外参数。每个参数可以有显式值,或者有隐式的 true 值。参数应该用逗号分隔,不带空格(例如 --args arg1=value,arg2)。在模板中通过 argument.name 访问参数。
  • --watch [默认: false] - 监视代码和模板文件夹的更改,并自动重新生成。
  • --verbose [默认: false] - 打开详细日志
  • --quiet [默认: false] - 关闭所有日志,仅输出错误
  • --disableCache [默认: false] - 关闭已解析数据的缓存
  • --prune [默认: false] - 修剪空的生成文件
  • --version - 显示当前版本的 Sourcery
  • --help - 显示帮助信息
  • --cacheBasePath - 缓存目录的基础路径。可以被配置文件覆盖。
  • --buildPath - 构建 .swifttemplate 文件时使用的目录路径。默认系统临时目录
  • --hideVersionHeader [默认: false] - 停止在生成文件头中添加 Sourcery 版本。

配置文件

你可以使用 .sourcery.yml 配置文件代替 CLI 参数:

sources:
  - <sources path>
  - <sources path>
templates:
  - <templates path>
  - <templates path>
forceParse:
  - <string value>
  - <string value>
output:
  <output path>
args:
  <name>: <value>

阅读更多关于配置文件的信息 这里.

问题

如果在使用二进制 zip 分发时收到未经验证的开发者警告,请尝试: xattr -dr com.apple.quarantine Sourcery-1.1.1

贡献

欢迎并鼓励对 Sourcery 的贡献!

参与很简单。详情请参见 贡献指南.

Github 上有贡献者列表.

为了明确我们社区的期望,Sourcery 采用了贡献者契约定义的行为准则。这份文件被许多开源社区使用,并很好地阐述了我的价值观。欲知更多信息,请参见 行为准则.

赞助

如果你想支持 Sourcery 的开发,可以通过 GitHub 赞助Open Collective 来实现,非常感谢 🙇‍

如果你是公司并希望直接资助项目并将其标识显示在这里,可以 直接联系我

赞助商

Bumble Inc

Airbnb Engineering

许可证

Sourcery 依据 MIT 许可证提供。更多信息见 LICENSE

归功于

此工具由以下提供支持

感谢以下人员!

  • Mariusz Ostrowski 为创建标识。
  • Artsy Eidolon 团队,因为我们使用他们的代码库作为解析器性能测试的存根数据。
  • Olivier Halligon 向我展示了 CLI 工具的设置脚本,这些脚本支持我们的 rakefile。
  • JP Simard 创建了 SourceKitten,该工具最初支持 Sourcery 并对这个项目的实现起着关键作用。

其他库/工具

如果你想为资产相关数据(如 .xib,.storyboards 等)生成代码,请使用 SwiftGen。SwiftGen 和 Sourcery 是互补的工具。

务必查看我其他的库和工具,尤其是:

  • KZPlayground - 针对 Swift 和 Objective-C 的强大 playground
  • KZFileWatchers - 用于观察本地和远程文件更改的守护进程,构建其他开发工具时使用(Sourcery 使用它)

你可以 关注我的推特 了解我正在创建的其他项目的新闻/更新。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号