概要
フロントエンドの開発する時、Husky
とlint-staged
を使ってGit
のcommit
を実行する時、自動でESLint
やPrettier
を実行するように設定して使っていました。
最近はGolangを使ってウェブサーバを開発したり、Flutterを使ってアプリを開発してますが、NodeベースではないプロジェクトでHuskyとlint-stagedのようにLinterやテストコードを実行する方法が必要にあんりました。
今回のブログポストではLefthook
を使ってGitのcommitを実行する時、Linterやテストコードを実行する方法を共有します。
- Lefthook: https://github.com/evilmartians/lefthook
Lefthookのインストール
Lefthook
は色んな言語やOSをサポートしています。自分の開発環境に合わせてLefthook
をインストールしてください。
- Node.js
- Go
- Ruby
- pip for Python
- Homebrew for MacOS and Linux
- Snap for Linux
- RPM packages for CentOS/Fedora Linux
- AUR for Arch
私はmacOS
を使っているので、次のコマンドを実行してLefthook
をインストールしました。
brew install lefthook
Lefthookの設定
このように設定したLefthook
を使うためには、開発しているプロジェクトのフォルダに./lefthook.yml
ファイルを作って次のように修正する必要があります。
pre-commit:
parallel: true
commands:
pretty:
glob: './src/**'
run: npx prettier --check {staged_files}
linter:
glob: 'src/**/*.{ts,tsx}'
run: npx eslint {staged_files}
pre-commit
またはpre-push
を使ってGitのcommitやpush以前に特定動作をするように設定することができます。parallel
オプションを使うと実行するコマンドを並列で実行できるように設定することができます。commads
には特定アクションの名前(pretty, linterなど)に実行するコマンド(run
)を設定することができます。
glob
を使うとファイルリストをフィルタリングすることができますし、root
オプションを使うとコマンドを実行するフォルダを指定することができます。
pre-commit:
commands:
backend-linter:
root: "api/" # Careful to have only trailing slash
glob: "*.rb" # glob filter
run: bundle exec rubocop {all_files}
これ以外にも次のような機能を使えます。
- Glob and regexp filters
- Run scripts
- Tags
- Support Docker
- Local config
- Direct control
- Your own tasks
- Optional output
Lefhookの実行
このように設定したLefthook
が上手く実行できるか確認するため次のコマンドを実行してみます。
lefthook run pre-commit
そしたら、./lefthook.yml
に設定したコマンドが実行されることが確認できます。
Lefthookの適用
lefthook run ...
コマンドは./lefthook.yml
ファイルの内容を1回だけ実行します。しかし、私たちはGit
のcommit
が実行されるたびに./lefthook.yml
ファイルに設定したコマンドを実行するように作りたいです。今度は次のコマンドを実行してGit
のcommit
が実行される時、./lefthook.yml
に設定したコマンドが実行されるように設定します。
lefthook install
今後、Git
のcommit
コマンドを実行すると、./lefthook.yml
に設定したコマンドが実行されることが確認できます。
特定フォルダ下のファイルが変更された時だけ実行する
Lefthook
を使う時、特定したフォルダ下のファイルが変更された時でk、特定コマンドを実行したい場合があります。例えば、フロントエンドとバックエンドを同時に管理するプロジェクトではフロントエンドコードだけ修正した場合、バックエンドに関するコマンドは実行したくない場合があります。
この時、次のようにfiles
オプションを使うと特定したフォルダ中のファイルが変更された時だけ特定コマンドを実行するように設定することができます。
pre-commit:
parallel: true
commands:
linter:
files: git diff --name-only HEAD | grep "frontend/" || echo ''
root: "frontend/"
run: npm run lint
test:
files: git diff --name-only HEAD | grep "backend/" || echo ''
root: "backend/"
run: go test ./backend/test/...
完了
これでLefthook
を使ってGit
のcommit
を実行する時、Linterとテストコード実行などのコマンドを実行する方法について説明しました。Lefthook
は色んな開発環境をサポートしてるので、Node開発環境ではないプロジェクトでも使えます。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Deku
が開発したアプリを使ってみてください。Deku
が開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。