0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SwiftFormat + husky + lint-stagedでSwiftコードをコミット時に自動整形する

Posted at

はじめに

本稿は、Swiftで書かれたソースコードを自動で整形する仕組みづくりを目的にしています。具体的には、 git commit する際に、gitのステージに上がっているソースファイルに対してコード整形を実行し、整形後のソースファイルがコミットされるようにします。

コード整形を自動化することで、常に 改行やインデントなどを定めたルール(コーディング規約)を適用し、ソースコードの品質を保つことができます。

【参考】Objective-C版はこちら

実行環境

macOSのバージョン

sw_vers
ProductName:		macOS
ProductVersion:		13.2.1
BuildVersion:		22D68

Swiftのバージョン

swift -version
swift-driver version: 1.62.15 Apple Swift version 5.7.2 (swiftlang-5.7.2.135.5 clang-1400.0.29.51)
Target: arm64-apple-macosx13.0

自動コード整形環境の構築

3つのツール

自動コード整形環境は、以下の3つのツールを組み合わせて構築します。

  1. SwiftFormat ... Swift用コード整形ツール。執筆時点でStarが6.5kあり、メンテナンスも継続中。また、設定できるルールも豊富なため採用しました

  2. husky ... 任意のコマンドを git commit 時などに実行するツール

  3. lint-staged ... 任意のコマンドをgitのステージに上がっているファイルに対して実行するツール

SwiftFormatのインストール

SwiftFormatのインストール方法はいくつか提供されていますが、本稿ではソースコードからビルドする方法を採用します。

git clone https://github.com/nicklockwood/SwiftFormat
cd SwiftFormat
swift build -c release

ビルドに成功すると、 /path/to/SwiftFormat/.build/release/swiftformat コマンドが生成されます。この swiftformat コマンドを適当なところに格納し、PATHを通します。正しくPATHが通っていれば、下記のコマンドでバージョン番号を確認できるはずです。

swiftformat -version
0.51.2

SwiftFormatの設定

プロジェクトのルートディレクトリ直下に、下記のような.swiftformatファイルを配置します。

.swiftformat
--swiftversion 5.7

--disable andOperator
--disable enumNamespaces
--disable numberFormatting

--ifdef noindent
--indentcase true
--stripunusedargs closure-only

.swiftformatファイルとは、コードスタイルなどコンフィグレーションを記述したファイルです。 .swiftformat というファイル名で保存しておくことで、 swiftformat コマンドが自動で読み込んでくれます。
このファイルの中身は、あなたのプロジェクトに合わせて編集してください。

node + npmのインストール

huskyおよびlint-stagedはどちらもnpmで配布されているパッケージです。そのため、まずは nodenpm コマンドをインストールします。既にインストールされている方は読み飛ばしてください。

本稿では、Node.jsのバージョン管理ツール volta を使います。

volta install node@18.14.2
node --version
volta install npm@9.5.1
npm --version

husky + lint-stagedのインストール

これ以降のコマンドはプロジェクトのルートディレクトリで実行してください。

下記のpackage.jsonをプロジェクトのルートディレクトリ直下に配置します。

package.json
{
  "name": "your project name",
  "private": true,
  "scripts": {
  }
}

huskyとlint-stagedをインストールします。

npm install -D husky lint-staged

huskyの設定

package.jsonに下記の "prepare" を追記します。

package.json
{
  "name": "your project name",
  "private": true,
  "scripts": {
    "prepare": "npx husky install && npx husky add .husky/pre-commit \"npx --no-install lint-staged\""
  },
  "devDependencies": {
    "husky": "^8.0.3",
    "lint-staged": "^13.2.0"
  }
}

以下のコマンドを実行します。

npm run prepare

コマンドが成功すると .husky ディレクトリが生成されます。
本稿の設定では、コミット前(pre-commit)に npx --no-install lint-staged コマンドが実行されます。

lint-stagedの設定

package.jsonに下記の "lint-staged" を追記します。

package.json
{
  "name": "your project name",
  "private": true,
  "scripts": {
    "prepare": "npx husky install && npx husky add .husky/pre-commit \"npx --no-install lint-staged\""
  },
  "devDependencies": {
    "husky": "^8.0.3",
    "lint-staged": "^13.2.0"
  },
  "lint-staged": {
    "./**/*.swift": [
      "swiftformat"
    ]
  }
}

"./**/*.swift" はプロジェクトのルートディレクトリ配下にあるすべての.swiftファイルを対象にしています。このパスはあなたのプロジェクトに合わせて調整してください。
gitステージに上げたファイルのうち、このパスの条件に合致するファイルに対して、 swiftformat コマンドを実行します。

以上でセットアップは完了です。

ここまでの操作で下記のファイルとディレクトリが生成されているはずです。

Your project root directory
- .husky/
- .swiftformat
- node_modules/
- package-lock.json
- package.json

使い方

gitステージに上げたSwiftソースファイルに対して、コミット時にコード整形を自動的に実行します。

git add [Swiftソースファイル]

git commit -m "コミットメッセージ"

コード整形されたソースファイルがコミットに反映されます。

以上でコード整形を自動で実行する仕組みができました。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?