swift-format

swift-formatSourceKit-LSP 提供了格式化技术,并为进行代码格式化转换提供了构建模块。

此软件包可以用作命令行工具,也可以作为 Swift Package Manager 依赖项链接到其他应用程序中,并通过API 调用。

注意:尚未提出默认的 Swift 代码样式指南。目前 swift-format 应用的样式只是一种可能性,提供此代码是为了可以在真实代码上进行测试,并通过修改进行实验。

使 swift-format 与您的 Swift 版本匹配

Swift 5.8 及更高版本

从 Swift 5.8 开始,swift-format 依赖于 SwiftSyntax 版本,该版本的解析器已在 Swift 中重写,不再依赖 Swift 工具链中的库。

此更改允许 swift-format 使用任何可以编译它的 Swift 版本进行构建、开发和运行,使其与支持特定语法的版本脱钩。但是,早期版本的 swift-format 仍然无法识别在更高版本的语言和解析器中添加的新语法。

另请注意,版本编号方案已更改为与 SwiftSyntax 匹配;swift-format 的 5.8 版本是 508.0.0,而不是 0.50800.0

Swift 5.7 及更早版本

swift-format 版本 0.50700.0 及更早版本依赖于 SwiftSyntax 版本,这些版本使用作为 Swift 工具链一部分发布的独立解析库。使用这些版本时,您应该检出并从与您使用的 Swift 版本兼容的发布标签或分支构建 swift-format

swift-format 和 SwiftSyntax 的主要版本和次要版本组件必须相同——这在 Package.swift 中的 SwiftSyntax 依赖项中表达——并且这些版本组件必须与已安装并用于构建和运行格式化程序的 Swift 工具链匹配

Xcode 发布版本 Swift 版本 swift-format 分支 / 标签
main 上的 Swift main
Xcode 14.0 Swift 5.7 release/5.7 / 0.50700.x
Xcode 13.3 Swift 5.6 release/5.6 / 0.50600.x
Xcode 13.0–13.2 Swift 5.5 swift-5.5-branch / 0.50500.x
Xcode 12.5 Swift 5.4 swift-5.4-branch / 0.50400.x
Xcode 12.0–12.4 Swift 5.3 swift-5.3-branch / 0.50300.x
Xcode 11.4–11.7 Swift 5.2 swift-5.2-branch / 0.50200.x
Xcode 11.0–11.3 Swift 5.1 swift-5.1-branch

例如,如果您正在使用 Xcode 13.3 (Swift 5.6),您将需要 swift-format 0.50600.0。

获取 swift-format

如果您主要对使用 swift-format 感兴趣(而不是开发它),那么您可以通过三种不同的方式获取它

包含在 Swift 工具链中

Swift 6(包含在 Xcode 16 中)及更高版本在工具链中包含 swift-format。您可以使用 swift format (注意空格而不是短划线)从系统上的任何位置运行 swift-format。要查找 swift-format 在 Xcode 中安装的路径,请运行 xcrun --find swift-format

通过 Homebrew 安装

运行 brew install swift-format 以安装最新版本。

从源代码构建

使用以下命令安装 swift-format

VERSION=510.1.0  # replace this with the version you need
git clone https://github.com/swiftlang/swift-format.git
cd swift-format
git checkout "tags/$VERSION"
swift build -c release

请注意,上面的 git checkout 命令会将存储库置于“分离 HEAD”状态。如果构建和运行该工具是您要做的全部事情,那么这很好。

构建完成后,swift-format 可执行文件将位于 .build/release/swift-format

要测试格式化程序是否已成功构建并且与您的 Swift 工具链兼容,您还可以运行以下命令

swift test --parallel

我们建议使用 --parallel 标志来加速测试运行,因为有大量测试。

命令行用法

swift-format 的一般调用语法如下

swift-format [SUBCOMMAND] [OPTIONS...] [FILES...]

该工具支持多个子命令,每个子命令都有自己的选项,如下所述。还可以通过运行 swift-format --help 获取可用子命令的描述,并且可以通过在子命令名称后使用 --help 标志来获取特定子命令的描述;例如,swift-format lint --help

格式化

swift-format [format] [OPTIONS...] [FILES...]

format 子命令格式化一个或多个 Swift 源文件(如果命令行上未给出文件路径,则从标准输入格式化源代码)。写出 format 子命令是可选的;如果没有给出其他子命令,它是默认行为。

此子命令支持所有常见的 lint 和 format 选项,以及以下仅格式化选项

Lint

swift-format lint [OPTIONS...] [FILES...]

lint 子命令检查一个或多个 Swift 源文件(如果命令行上未给出文件路径,则从标准输入检查源代码)是否存在样式违规,并将检测到的任何违规的诊断信息打印到标准错误。

此子命令支持所有常见的 lint 和 format 选项,以及以下仅 lint 选项

格式化和 Lint 支持的选项

formatlint 子命令都支持以下选项

查看默认配置

swift-format dump-configuration

dump-configuration 子命令将默认配置以 JSON 格式转储到标准输出。这可以通过将其重定向到文件并进行编辑来简化自定义配置的生成。

配置命令行工具

对于正在检查或格式化的任何源文件,swift-format 都会在同一目录中查找名为 .swift-format 的 JSON 格式文件。如果找到,则加载该文件以确定工具的配置。如果未找到该文件,则在父目录中查找,依此类推。

如果未找到配置文件,则使用默认配置。可以通过运行 swift-format dump-configuration 查看默认配置中的设置,这将将其转储到标准输出。

如果将 --configuration <configuration> 选项传递给 swift-format,则将无条件地使用该配置,并且不会搜索文件系统。

有关配置格式和可用设置的说明,请参阅 Documentation/Configuration.md

查看有效配置

dump-configuration 子命令接受 --effective 标志。如果设置,它将转储如果从当前工作目录执行 swift-format 将使用的配置,并考虑如上所述的 .swift-format 文件或 --configuration 选项。

杂项

运行 swift-format -vswift-format --version 将打印有关 swift-format 版本的版本信息,然后退出。

API 用法

swift-format 可以轻松集成到用 Swift 编写的其他工具中。用户可以依赖 swift-format 作为 Swift Package Manager 依赖项并导入 SwiftFormat 模块,而不是通过生成子进程来调用格式化程序,该模块包含格式化程序的诊断和更正行为的入口点。

格式化行为由 SwiftFormatter 类提供,lint 行为由 SwiftLinter 类提供。这些 API 可以传递 Swift 源文件 URL 或表示 SwiftSyntax 语法树的 Syntax 节点。后一种功能对于编写代码生成器特别有用,因为它显着减少了生成器需要关注添加到其创建的语法节点的 trivia 量。相反,它可以将内存中的语法树传递给 SwiftFormat API,并接收完美格式化的代码作为输出。

有关其用法的更多信息,请参阅 SwiftFormatterSwiftLinter 类中的文档。

检出源代码以进行开发

main 分支用于开发。拉取请求应创建为合并到 main 分支中;在合并到 main 后,可以将低风险且与最新发布分支兼容的更改 cherry-pick 到该分支中。

如果您有兴趣开发 swift-format,则可以在此处找到有关该主题的更多文档。

贡献

欢迎并鼓励为 Swift 做出贡献!请参阅Swift 贡献指南

在提交拉取请求之前,请确保您已测试了您的更改,并且它们遵循 Swift 项目的代码贡献指南

为了成为一个真正伟大的社区,Swift.org 需要欢迎来自各行各业、具有不同背景和各种经验的开发人员。一个多元化和友好的社区将有更多的好主意、更独特的视角,并产生更多的优秀代码。我们将努力使 Swift 社区欢迎所有人。

为了明确我们对成员的期望,Swift 采用了 Contributor Covenant 定义的行为准则。这份文档在许多开源社区中使用,我们认为它很好地表达了我们的价值观。有关更多信息,请参阅行为准则