Space Commander 介绍

Space Commander 是 Square 开源的一款 Objective C 代码格式化工具,这个工具可以为 iOS 开发者向 Git 仓库提交代码时提供统一的格式化能力。

以下一节翻译自 Space Commander README.md

Space Commander 让一组 iOS 开发人员可以向 git 仓库提交统一格式的代码,无需任何人工修复。

你可以使用它完成以下工作:

  • 在代码提交前强制使用统一的格式
  • 一键格式化代码(单个文件或整个仓库)
  • 未格式化的代码提交时编译失败

在 Square,Space Commander 有一个针对 pull request 的工作流水线。应用格式化标准时无需人工干预,时间可以花在更有意义的地方。

你可以 for Space Commander,然后使用自己的格式化规则,或者直接使用 Square 的 Objective-C 格式化规则。

  • 本地安装

从 git 仓库根目录,运行 path/to/spacecommander/setup-repo.sh 即可为当前仓库添加 pre-commit

  • 用法

运行 setup-repo.sh 之后每次提交代码时会自动进行格式化检查。

运行 format-objc-file.sh <file> 可以对单个文件进行格式化。运行 format-objc-file-dry-run.sh <file> 可以对单个文件进行格式化,但不修改文件本身。

运行 format-objc-files-in-repo.sh 格式化仓库中所有的的 OC 文件。

  • 详情

项目中的每个开发者运行 setup script 后就会安装 pre-commit 钩子。这个钩子会在 commit 成功前检查代码是否有格式化。

commit 时如果有格式错误,会自动运行一个修复代码的脚本。

在 Square,这个提供格式化脚本的仓库是更大规模的 iOS 项目中的一个子模块,所以格式化规则及脚本会锁定到父仓库的某个版本。我们以这种方式检出格式化的代码,作为构建过程中的一部分。如果格式不正确,构建会中止。

  • 配置

为了只格式化特定目录中的 OC 文件,需要在 .formatting-directory 指定每个目录的名字。否则,将检查仓库中所有的 OC 文件。

为了忽略特定目录中的 OC 文件,需要在 .formatting-directory-ignore 指定每个目录的名字。

编辑以下文件来修改格式化输出:

  • 编辑 .clang-format 修改内置的 clang-format 选项
  • format-objc-file-dry-run.shformat-objc-file.sh 来修改 custom/ 中的规则
  • Testing Support/ 用于验证修改

如果期望 formatter 忽略某些文件,可以在文件的第一行添加 #pragma Formatter Exempt// MARK: Formatter Exempt

  • 自定义规则

clang-format 非常赞,我们喜欢它。但它仍然有许多限制。我们在 custom/ 中添加了自己的格式化规则。你也可以在 custom/ 中添加自己的规则,然后调用 format-objc-file.shformat-objc-file-dry-run.sh 来应用新的规则。输入输出示例添加到 Testing Support/ 目录下。

  • 预期外的输出

formatter 并不能完成所有的事情。偶尔会产生预期外的结果,此时的处理办法如下:

  • 重构代码,以便 formatter 更容易识别代码
  • 使用 // clang-format off// clang-format on 来选择性地为文件中的指定行开启或关闭 clang-format
  • 在文件首行添加 #pragma Formatter Exempt// MARK: Formatter Exempt,当前文件不会被格式化

参考