
pre-commit を使っていて「Pythonプロジェクトじゃないのに、なぜPythonが必要なんだ」と思ったことはありませんか?
prek
は、pre-commitをRustで再実装したGit hooks管理ツールです。既存の.pre-commit-config.yamlをそのまま使えて、Pythonランタイム不要、シングルバイナリで動作します。本記事では、prekの特徴と移行手順、そして「速さ」より重要な「ポータビリティ」について書きます。
pre-commitの本質的な課題
pre-commitは優れたツールですが、いくつかの課題があります:
- Python必須 - Go/Rust/TypeScriptプロジェクトでもPython環境が必要
- virtualenv管理 - プロジェクトのPythonバージョンと競合する可能性
- CI/CDの複雑化 -
setup-python+pip install pre-commitのステップが必要 - オンボーディングの障壁 - 新メンバーがPython環境構築から始める必要
特に非Pythonプロジェクトでは、「Git hooksのためだけにPythonを入れる」という状況が発生します。
prekの特徴
prek (MIT License)は、これらの課題を解決します:
1. シングルバイナリ・依存ゼロ
| |
Pythonランタイム不要。バイナリ1つで動作します。
2. pre-commit完全互換
既存の.pre-commit-config.yamlをそのまま使用可能:
| |
移行は pre-commit uninstall && prek install のみ。
3. 高速化
公式ベンチマーク(Apache Airflow):
| 操作 | pre-commit | prek | 倍率 |
|---|---|---|---|
| 初回インストール | 187秒 | 18秒 | 10.2倍 |
| フック実行 | 352ms | 77ms | 4.6倍 |
| ディスク使用量 | 1.6GB | 810MB | 半分 |
ただし、これは「おまけ」です。本質的な価値は次のセクションで説明します。
ポータビリティの価値
Rustツールの真の価値は「速さ」ではなく「ポータビリティ」です。
CI/CDの簡素化
pre-commitの場合:
| |
prekの場合:
| |
セットアップステップが不要になります。
開発環境の依存削減
pre-commitの依存関係:
プロジェクト
├── Python 3.11(アプリ用)
└── Python 3.9(pre-commit用、virtualenv)
└── pre-commit
└── 各フックの依存関係
prekの依存関係:
プロジェクト
└── prek(単一バイナリ)
└── 各フックの依存関係
Pythonバージョン競合のリスクがなくなります。
クロスプラットフォーム対応
同一バイナリがWindows/macOS/Linuxで動作:
| |
開発環境の差異を吸収します。
移行手順
1. prekのインストール
| |
2. 既存のpre-commitをアンインストール
| |
3. prekをインストール
| |
.pre-commit-config.yamlはそのまま使用できます。
4. 動作確認
| |
5. GitHub Actions更新
| |
prekの追加機能
pre-commitにはない便利な機能:
フック一覧表示
| |
ディレクトリ指定実行
| |
最終コミット対象のみ実行
| |
モノレポ対応
サブプロジェクトごとに.pre-commit-config.yamlを配置可能:
monorepo/
├── .pre-commit-config.yaml # ルート
├── frontend/
│ └── .pre-commit-config.yaml
└── backend/
└── .pre-commit-config.yaml
| |
注意点
1. 開発中のツール
現在v0.3.1。一部の言語とサブコマンドが未実装です:
本番導入前に、使用するフックの動作確認を推奨します。
2. pre-commit独自機能
一部のpre-commit独自機能は未対応の可能性があります。移行前に.pre-commit-config.yamlの内容を確認してください。
他のツールとの比較
| ツール | 言語 | pre-commit互換 | 依存 |
|---|---|---|---|
| prek | Rust | ✅ 完全 | なし |
| lefthook | Go | ❌ 独自設定 | なし |
| hk | Rust | ❌ 独自設定 | なし |
| Husky | Node.js | ❌ 独自設定 | Node.js |
| pre-commit | Python | - | Python |
設定互換性の重要性:
lefthookやhkも高速ですが、既存の.pre-commit-config.yamlを書き換える必要があります。prekは設定ファイルをそのまま使えるため、移行コストがゼロです。
採用実績
著名なOSSプロジェクトが採用:
まとめ
prekの本質的な価値は「速さ」ではなく「ポータビリティ」です:
- 依存関係の削減 - Pythonランタイム不要
- CI/CDの簡素化 - セットアップステップ削減
- 開発環境の統一 - クロスプラットフォーム対応
- 移行コストゼロ - 既存設定をそのまま使用可能
非Pythonプロジェクトや、チーム全体の開発環境を簡素化したい場合に特におすすめです。
興味のある方はぜひ試してみてください。