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.

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

Last updated at Posted at 2023-03-07

はじめに

前回の記事「Uncrustifyを使ってObjCコードを整形する」ではUncrustifyの基本的な使い方について触れました。

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

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

【参考】Swift版はこちら

実行環境

macOSのバージョン

sw_vers
ProductName:		macOS
ProductVersion:		13.1
BuildVersion:		22C65

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

3つのツール

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

  1. uncrustify ... コード整形ツール

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

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

uncrustifyの設定

Uncrustifyを使ってObjCコードを整形する」を参考に uncrustify コマンドが使えるようにしてください。
また、コード整形ルールを定義したコンフィグファイルを作成してください。本稿ではuncrustify-objc.cfgというファイル名でプロジェクトのルートディレクトリに保存しています。

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のインストール

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

npm init

対話形式でいろいろ入力を求められますが、returnキー連打で構いません。すべて入力するとpackage.jsonが生成されます。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.1.2"
  }
}

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

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.1.2"
  },
  "lint-staged": {
    "./**/*.{m,h}": [
      "uncrustify -c uncrustify-objc.cfg --no-backup -l OC"
    ]
  }
}

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

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

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

Your project root directory
- .husky/
- node_modules/
- package-lock.json
- package.json
- uncrustify-objc.cfg

使い方

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

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

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?