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 版本来构建、开发和运行 swift-format,使其与支持特定语法的版本分离。但是,早期版本的 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 分支/标签
Swift at main 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 感兴趣(而不是开发它),那么在确定所需的版本后,您可以检出源代码并使用以下命令进行构建

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

请注意,上面的 git checkout 命令会将存储库置于“detached 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 选项,以及以下仅格式化选项

Linting

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

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

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

格式化和 Linting 支持的选项

formatlint 子命令都支持以下选项

查看默认配置

swift-format dump-configuration

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

配置命令行工具

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

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

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

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

其他

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

API 用法

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

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

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

检出源代码进行开发

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

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