Lefthook vs pre-commit: Hookマネージャの比較
Lefthookはhooksを並列実行する高速な単一のGoバイナリです。pre-commitは、すぐに使えるhooksの大きなレジストリを持つPythonフレームワークです。
LefthookはhooksをYAMLで設定し並列実行し、依存関係のない単一バイナリとして配布されるため、高速で言語非依存です。Pythonで書かれたpre-commitは、隔離されたhook環境を管理し、バージョンで固定された共有可能なhooksの巨大なエコシステムを提供します。これはリポジトリ間でチェックを標準化するのに優れています。Lefthookは速度とシンプルさを、pre-commitは豊かで再現可能なhookカタログを優先します。
| Lefthook | pre-commit | |
|---|---|---|
| ランタイム | 単一のGoバイナリ | Pythonフレームワーク |
| hookエコシステム | コマンドを自分で定義 | 大きな共有レジストリ |
| 並列性 | 組み込み | 限定的 |
| 環境の隔離 | なし | hookごとの環境 |
| 最適な用途 | 速度、シンプルさ | 共有・固定されたhooks |
CIでの利用
pre-commitは、多くのリポジトリで再利用される、キュレーションされバージョン固定されたコミュニティのhooksが欲しいときに輝き、クリーンなCIモードを備えています。Lefthookはより高速で依存関係がなく、主に自分のコマンドを実行し並列性が欲しいときに理想的です。ローカルのhookを超えてチェックが強制されるよう、どちらもCIでも実行すべきです。
高速化する
hook環境(pre-commit)または依存関係をキャッシュして、CIのチェックがウォームな状態で始まるようにします。チェックはランナー上で実行され、より高速なマネージドランナーはhookとlintの実行を短縮します。
結論
リポジトリ間で標準化された、共有可能でバージョン固定されたhooksの大きなレジストリが欲しい場合: pre-commit。自分のコマンドを並列で実行する高速で依存関係のないバイナリが欲しい場合: Lefthook。共有hookカタログを重視するチームはpre-commitに、速度重視のチームはLefthookに傾きます。