背景
2024年9月17日にリリースされたXcode16から内蔵ツールチェーンにswift-formatが同梱されるようになりました。これにより、SPMやHomebrewを用いてインストールしなくてもswift-formatが利用できるようになっています。
XcodeのIDE内においては、^+⇧+I
などのコマンドによってファイル毎にフォーマットすることは可能ですが、コミット時に自動フォーマットでき、かつチームメンバーの初期設定が不要だと便利そうだったので、その手順をメモします。
ビルド時の自動フォーマットはあまり良くなかった
XcodeのBuild Phasesでビルド時にswift-formatを実行することも可能ですが、ビルド時にファイルが書き換えられると、Undo(⌘+Z)で元に戻すことができないという問題がありました。そのため、ビルド時ではなく、Gitコミット時のタイミングで自動フォーマットを行う構成にしました。
1. Scripts/install-git-hooks.sh
を作成
#!/bin/bash
HOOKS_DIR=$(git rev-parse --show-toplevel)/.git/hooks
cp Scripts/hooks/pre-commit "$HOOKS_DIR/pre-commit"
chmod +x "$HOOKS_DIR/pre-commit"
echo "✅ Git hooks installed!"
2. Scripts/hooks/pre-commit
に swift-format 実行処理を記述
#!/bin/bash
TARGET_DIR=$(git rev-parse --show-toplevel)
if xcrun --find swift-format >/dev/null; then
xcrun swift-format format --in-place --recursive "$TARGET_DIR"
else
echo "⚠️ swift-format が見つかりませんでした。"
exit 0
fi
if ! git diff --quiet; then
echo ""
echo "✨ swift-format によりファイルが修正されました。"
echo "変更を確認し、もう一度コミットしてください。"
echo ""
echo "🔍 修正されたファイル:"
git diff --stat
exit 1
fi
3. .swift-format
を設定する(任意)
{
"maximumBlankLines" : 1,
"indentConditionalCompilationBlocks" : false,
"lineLength" : 100,
"lineBreakBeforeEachGenericRequirement" : true,
"lineBreakBeforeEachArgument" : true,
"indentation" : {
"spaces" : 4
}
}
この時点でプロジェクトのディレクトリ構造が以下のようになっていればOKです。
4. install-git-hooks.sh
をBuild Phasesから実行する
bash "${SRCROOT}/Scripts/install-git-hooks.sh"
これにより、Xcodeビルド時に自動で .git/hooks/pre-commit がセットアップされます。
🎉動作確認
初回の動作確認の前に1回以上ビルドしてください。.git/hooks/pre-commit がセットアップされます。
ここまでの手順で Xcode 等で commit する際にフォーマットがかかり、アラートウィンドウとして表示されるようになります。