こんにちは、PHONE APPLIのスマホチーム所属、チームリーダー担当の高橋 篤史(たかはし あつし)です。
今回で記事書くのは3回目です。
過去2回は技術というよりかはチーム活動の紹介しかしていなかったことを反省し、今回は技術的な記事を書くことにチャレンジしたいと思います!
この記事のターゲット
- iOS開発初心者
- コードの共通ルールがほしいと思っている管理者やチームリーダー
SwiftLintとは
SwiftLint は GitHub の Swift Style Guide に基づいて、 Swift のスタイルと規則を自動でチェック・ルールによって自動でコードを修正するツールです。
メンテナンスはRealm Inc.が行っているOSS(Open Source Software)です。Star(いいねのようなもの)の数が2021年2月時点で14000を超えており、多くのSwift言語を使用するエンジニアから支持されていることがわかります。
導入背景
一定の秩序の必要性
「自分はこう書きたいんだ!」「この方が綺麗だし、いいコードだと思うんだ!」 ということは、プログラマとしてよくある話だと思います(実際自分でも思うところはあります(笑))し、よりいいものを追求していくことは素晴らしいことだと考えています。
ただ、こういった話はその人の主観だったり解釈になりやすく、衝突の原因になりやすいという点がデメリットとして挙げられるとも考えています。
スマホチームは2020年4月時点では8名でしたが、2021年2月現在では16名と、1年足らずでメンバーが倍になっています。 人数が少ない間は誰が何をしているかも各々ですぐに把握可能でしたし、ちょっと集まって会話をすれば多少の衝突はすぐに解決できていました。
しかし、人数が増えていくにつれ、一定の秩序を元に開発を行わないと余計な衝突に時間をかけてしまい、本来進めるべきユーザーに価値を届ける開発に集中できなくなるのではないか、という思いを抱きました。
そのため、公式のSwiftドキュメントにまとめられているようなルールに関しては自動でチェックし、より本質的なことに集中するためにSwiftLintの導入をしました。
導入方法
※記事執筆時点での開発環境の最新バージョンは以下です。
- Xcode 12.4
- Swift 5.3.2
- SwiftLint 0.42.0
おおまかな流れとしては
- SwiftLintのインストール
- スクリプトを記載する
- (お好みで)ルールを調整する
です、一つずつ解説します。
1. SwiftLintのインストール
Homebrew
やCocoaPods
でインストールが可能です。
※Mint
を使用する方法もあるのですが、今回は割愛します。
Homebrew
の場合
ターミナルやiTermなどのコマンドラインツールで以下のコマンドを実行します。
brew install swiftlint
Homebrew
でインストールする場合のメリット・デメリット
メリット
CocoaPods
などのライブラリ管理ツールを導入・学習する必要がなく、気軽に試すことが可能。個人開発やお試し導入に向いている。
デメリット
- 複数人開発の際に、開発者間でSwiftLintのバージョンで差分が発生してしまう可能性がある。
- 複数人開発の際に、開発者が各々でSwiftLintをインストールする必要がある。
CocoaPods
の場合
Podfileに以下を記載してpod install
を行います。
pod 'SwiftLint'
CocoaPods
でインストールする場合のメリット・デメリット
メリット
- 複数人開発の際に、開発者間でSwiftLintのバージョンを統一可能。
- 複数人開発の際に、開発者が各々でSwiftLintをインストールする必要がない。
デメリット
- ライブラリ管理ツールの導入・学習コスト。気軽に試すことが難しい。
2. スクリプトを記載する
Xcodeプロジェクトを開き、Build Phases > New Run Script Phases
でRun Script
を新規作成します。
作成したRun Script
に以下のスクリプトを記載します。
スクリプトを記載した後にビルドをすると、SwiftLintで設定されたルールに反した実装箇所に、警告やエラーが表示されるようになります。
Homebrew
の場合
if which swiftlint >/dev/null; then swiftlint else echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint" fi
CocoaPods
の場合
if which "${PODS_ROOT}/SwiftLint/swiftlint" >/dev/null; then "${PODS_ROOT}/SwiftLint/swiftlint" else echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint" fi
3. (お好みで)ルールを調整する
2.まででSwiftLintでデフォルト設定されているルールはチェックできるのですが
.swiftlint.yml
というファイルを新規作成することで、ルールをカスタマイズすることができます。
細かいルールについては今回は紹介しませんが、ymlファイルを記載する際に覚えておいた方がいい用語を紹介します。
disabled_rules
: デフォルトの設定から適応しないルールを記載しますopt_in_rules
: デフォルト以外で追加したいルールを記載しますcustom_rules
: (一定のルールを元に)カスタムされたルールを追加できますexcluded
: SwiftLintでチェックしないファイルやディレクトリを記載します
細かいルールの内容は以下が公式ドキュメントです、興味あれば覗いてみてください。 realm.github.io
Auto Correctについて
一部のルールでは、スクリプトにswiftlint autocorrect
を記載すると、ビルドした際に自動的にルールに従ってコードが修正されます。
Homebrew
の場合
if which swiftlint >/dev/null; then swiftlint swiftlint autocorrect else echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint" fi
CocoaPods
の場合
if which "${PODS_ROOT}/SwiftLint/swiftlint" >/dev/null; then "${PODS_ROOT}/SwiftLint/swiftlint" swiftlint autocorrect else echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint" fi
「自動で修正してくれるって便利!」という考えもあるのですが、裏を返すと意図しない変更が勝手にされてしまう、というデメリットがあると考えています。
そのため、スマホチームではAuto Correct
は基本的には使用していません。
(定期的にコードフォーマットがルール通りかを確認することがあり、その際に一時的に使用することはあります。)
今後の展望
現状、SwiftLintの警告が出ているかが実際に自分の手元でビルドしてみないとわからないため、まだ不便な点があります。
Pull Request時に修正したファイルのみにSwiftLintのチェックをかけ、Pull Requestに自動で警告コメントをする仕組みを作る予定です。
引き続き開発効率の向上に取り組んでいきます!
最後まで読んでいただき、ありがとうございました!