🐾

SwiftLint自動フォーマット修正

2024/07/12に公開

開発中にいちいちcode formatを調整のは面倒なので、git commitの際にcodeを自動修正させたいです。

SwiftLintの導入
https://github.com/realm/SwiftLint

インストール終わったら、projectの下に.swiftlint.yml隠しファイルがある。

swiftlint自動修正手動実行

コマンドラインで指定swiftファイルに指定swiftlint.ymlで自動フォーマット修正

swiftlint --config {.swiftlint.ymlファイルパス} --fix {swiftファイルパス}

git commitの際にswiftlint自動修正を実行

projectの下に隠しフォルダー.gitで、pre-commit.sampleをコピーして、.sample拡張子を削除

任意code編集ツールでpre-commitを開いて、以下のcodeを入力

#!/bin/sh

# 変更されたswiftファイルを検索
git_diff=$(git diff --cached --name-only --diff-filter=AM -- '*.swift')

# 指定.swiftlint.ymlを複製して、変更されたswiftファイルを追加
if [ -n "$git_diff" ]; then
  cp .swiftlint.yml .swiftlint.precommit.yml

  echo 'included:' >> .swiftlint.precommit.yml
  echo "$git_diff" | sed -e "s/^/  - /" >> .swiftlint.precommit.yml

  echo 'lint the following files'
  echo "$git_diff" | sed -e "s/^/  - /"
  echo ""
else
  echo 'No changed .swift file'
  exit 0;
fi

# swiftlintを実行して、swiftファイルのチェック結果を取得
lint_result=$(swiftlint --reporter emoji --quiet --config .swiftlint.precommit.yml)

# swiftlintにより変更があれば、git commitを止めて、swiftファイルを自動フォマートする
if [ -n "$lint_result" ]; then
	swiftlint --reporter emoji --quiet --config .swiftlint.precommit.yml --fix

  echo 'Some issues found.'
  echo '====================================='
  echo "$lint_result" | sed -e "s/^/>> /"
  echo '====================================='
  echo ''

	rm .swiftlint.precommit.yml

  exit 1;
else
  echo 'No issues found!'
fi

# 実行を終わる前に複製したymlを削除
rm .swiftlint.precommit.yml

exit 0

使ってみる

フォーマットがバラバラのコードを書いて、コミットします。

コミットの前にswiftlintチェックを行い、コードフォーマットを自動修正できます。
もし修正がなければそのままコミットを行います。

一部のruleが自動修正できません。
コマンドラインでswiftlint rulesを実行して、correctableでnoになってるruleは自動修正対象外です。

SKIYAKI Tech Blog

Discussion