はじめに
この記事はand factory Advent Calendar 2020 の3日目の記事です。
昨日は@yasukotelinさんのKotlinでResult型使うならkotlin-resultを使おうでした🎉
やりたいこと
- swiftlintのルールに合わせて、debugビルド時にコードを自動修正する
背景
僕のチームでは、
今期から3人で2つのプロジェクトの開発を担当しています。
それぞれswiftlintのルールが微妙に違うため、
プロジェクトごとに細かな記法を意識してコーディングする必要があり、
少し手間に感じていました。
そこで、今回swiftlintの機能を用いて
ルールに反したコードを自動修正する仕組みを導入します。
やること
1.Swiftlintを導入
2.BuildPhaseで実行するスクリプトを書く
swiftlintの導入
Mintで導入してます
realm/SwiftLint@0.39.2
BuildPhasesにscriptを定義
最終的に採用したスクリプト
if [ $CONFIGURATION = "Debug" ]; then
git diff --name-only | grep .swift | grep -v Pods/ | grep -v R.generated.swift | while read filename; do
xcrun --sdk macosx mint run SwiftLint swiftlint autocorrect --path "$filename"
done
xcrun --sdk macosx mint run SwiftLint swiftlint
fi
スタックしたポイント
エラー: Parse error(s)
下記スクリプトでビルドしてみると、エラーが。。。
if [ $CONFIGURATION = "Debug" ]; then
mint run SwiftLint swiftlint autocorrect --path "$filename"
mint run SwiftLint swiftlint
fi
github.com_realm_Swiftlint: manifest parse error(s)
unable to load standard library for target 'x86_64-apple-macosx-10.15'
using sysroot for 'iPhoneSimulator' but targeting 'MacOSX'
上記エラーは
SwiftlintをmacOS用にビルドしようとしているのに、
利用するSDKがiOSシミュレーター用になっているのが原因のようです。
BuildPhaseに unset SDKROOT
を追記することで
スクリプト実行の間だけ環境変数SDKROOTを解除し、回避することも可能ですが、
macosxのsdkを指定するほうがおすすめです。
xcrun --sdk macosx mint run SwiftLint swiftlint
各コミットで発生した差分のみ自動修正したい
while文で対象を指定することで解決しました。
git diff --name-only | grep .swift | grep -v Pods/ | grep -v R.generated.swift | while read filename; do
xcrun --sdk macosx mint run SwiftLint swiftlint autocorrect --path "$filename"
done
運用
autocorrect機能を本導入する際に、
プロジェクト全体を自動修正しておきます。
その後修正対象を差分に絞ると
debugビルドを実行するたびに差分を自動修正してくれます👏
まとめ
細かな記法を気にせず進めるために導入しましたが、
記法ミスがあっても勝手に修正されるのは気持ち的にかなり楽です。
参考URL
- Swiftの静的解析ツール「SwiftLint」のセットアップ方法
- XcodeのBuild Phasesでmintを実行する時の注意点
- [iOS]Mintを使ってプロジェクトごとのSwift製CLIツールのパッケージ管理を行う
- Swiftlint
先人の知恵に感謝...🙏🙏🙏
おわり