LoginSignup
12
2

More than 3 years have passed since last update.

[Swift] pre-commit でコミット時に SwiftFormat を適用する

Last updated at Posted at 2020-02-27

Tl;Dr

SwiftFormatpre-commit に対応しているので .pre-commit-config.yaml を作成し、

.pre-commit-config.yaml
repos:
-   repo: https://github.com/nicklockwood/SwiftFormat
    rev: 0.44.2
    hooks:
    -   id: swiftformat

pre-commit installすればコミット時に適用してくれるようになる。
CDF672A6-9B7B-43A7-A75B-7B6857080291.png

なぜ?

通常の iOSアプリプロジェクトであれば SwiftFormat は Xcode における Build Phases に組み込んで適用するのがセオリーといえる。

しかし、Swift Package Manager の場合、XcodeプロジェクトはPackage.swiftおよびディレクトリツリーから自動生成するため、Xcodeの設定を変更するやり方はあまりベターではない(Xcode 11.4 からLSP が同梱されるようになったことから、そもそも Xcode の利用はオプショナルになりつつもある)。

そのため、Git の pre-commit でフックするやり方も考えられる。

pre-commit

pre-commit は Python製のツールで、Git の pre-commit にフックするスクリプトを管理するためのエコシステムのようなものらしい。Swift Package Manager が Swift 製のライブラリを管理するエコシステムであれば、それの pre-commit hook 版、といったところだろうか。

以下の記事がわかりやすかった。
Python製のツールpre-commitでGitのpre-commit hookを楽々管理!!

導入

pre-commit 自体は Homebrew でインストールできるので brew install pre-commit するだけでよい。

あとは冒頭に書いたように.pre-commit-config.yamlを作成し、pre-commit installすれば導入は完了である。

私のリポジトリではMakefileBrewfileを用意し、make setupの1コマンドで導入できるようにしている。

Makefile
setup:
  brew bundle
  pre-commit install
Brewfile
brew "pre-commit"

使い方

コミット時に SwiftFormat により変更が入った場合、コミットは失敗して変更自体はアンステージされた状態になる。

冒頭の画像の再掲となるが、 Failed と右上に表示されているのはそういう意味である。
CDF672A6-9B7B-43A7-A75B-7B6857080291.png

そのため、適用された変更はgit addでステージした上で再度コミットする必要がある。

補足

SwiftFormat の README には通常のpre-commit hook を利用した手順も記載されている。

pre-commit
#!/bin/bash
git diff —diff-filter=d —staged —name-only | grep -e\(.*\).swift$’ | while read line; do
  swiftformat “${line};
  git add "$line";
done

このスクリプトは swiftformat を実行後に自動的に git add する作りになっているため、 pre-commit のようにコミットに失敗したらステージして再度コミットする、といった手間がない。

一方、ファイル全体をgit addされてしまう為、部分的にステージ(git add -p)・コミットしたい場合などに、意図しなかった変更までコミットしてしまうリスクもある。

このあたりはトレードオフではあるが、個人的には pre-commit の方が安全であると感じる。

終わりに

Swift Package Manager のプロジェクトでも、SwiftFormat で一貫したコードスタイルを。

12
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
2