Husky vs Lefthook: Git Hooksの管理
Huskyは広く使われているNodeベースのgit hooksマネージャです。Lefthookは、hooksを並列実行する高速で言語非依存の単一バイナリです。
HuskyはNodeプロジェクト向けに最小限の設定でgit hooksをセットアップし、多くのJavaScriptチームのデフォルトで、通常lint-stagedと組み合わせて使われます。Lefthookは任意の言語で動作するスタンドアロンのGoバイナリで、hooksをYAMLで設定し、glob フィルタリングを組み込んでコマンドを並列実行します。HuskyはJSエコシステムにネイティブで普及しており、Lefthookはより高速で言語非依存です。
| Husky | Lefthook | |
|---|---|---|
| ランタイム | Node | 単一のGoバイナリ |
| 言語 | JS中心 | 任意の言語 |
| 並列性 | lint-staged経由 | 組み込み |
| 設定 | hookスクリプト | YAML |
| 最適な用途 | Nodeプロジェクト | 多言語、速度 |
CIでの利用
hooksは主にローカルで実行されますが、本当のゲートとして同じチェックはCIに置くべきです。Huskyはすでにnpmのツールを使っているNodeリポジトリにフィットします。LefthookはNodeなしでどこでも動作しチェックを並列化するため、大きなpre-commitスイートに役立ちます。いずれにせよ、ローカルの設定に関係なくチェックが強制されるよう、hookコマンドをCIジョブでミラーリングしましょう。
高速化する
CIで同じlint/testコマンドを実行し、依存関係をキャッシュしてウォームな状態で始まるようにします。CIのチェックはランナー上で実行され、より高速なマネージドランナーはlintとテストの実行を短縮します。
結論
普及して十分に文書化された選択肢が欲しいNode中心のプロジェクト: Husky。多言語リポジトリ、または並列hooksを備えた高速で依存関係のないバイナリが欲しい場合: Lefthook。どちらを選んでも、hooksだけに頼るのではなくCIで同じチェックを強制しましょう。