1日に1つパッケージ Pre-Commit
By khoanc, at: 2024年8月12日15:28
予想読書時間: __READING_TIME__ 分
Pre-commit フックは、コードの品質を維持し、問題がコードベースに入る前に問題を防止するための不可欠なツールです。"Pre-commit" パッケージは、これらのフックの実行を自動化し、開発者がリポジトリに変更をコミットするたびに、コード標準が満たされていることを確認します。
"Pre-commit" を使用すると、潜在的なエラーを検出し、一貫したコーディングプラクティスを強制実行し、自動的に実行される一連のチェックを設定できます。このパッケージは、さまざまな組み込みフックとカスタムフックの作成サポートを提供することでプロセスを簡素化し、プロジェクトの特定のニーズに合わせて調整できます。
この記事では、"Pre-commit" の開始方法、主要な機能、コード品質チェックを自動化することで開発ワークフローをどのように強化できるかを探ります。
インストール
"Pre-commit" パッケージをインストールする方法に関するステップバイステップガイドを提供します。 pip でインストールするためのコマンドと、セットアップに必要な前提条件を含めます。
pip install pre-commit
はじめに
プロジェクトで "Pre-commit" を初期化および設定する方法について説明します。 .pre-commit-config.yaml ファイルをサンプル構成で設定する方法について説明します。
# .pre-commit-config.yaml
repos:
- repo: https://github.com/psf/black
rev: 23.7.0 # 最新の安定バージョンを使用
hooks:
- id: black
args: [--line-length=88] # 行の長さを好みに合わせて調整
- repo: https://github.com/pycqa/flake8
rev: 6.1.0 # 最新の安定バージョンを使用
hooks:
- id: flake8
args: [--max-line-length=88] # 行の長さを Black に合わせて調整
- repo: https://github.com/PyCQA/bandit
rev: 1.7.5 # 最新の安定バージョンを使用
hooks:
- id: bandit
args: ["--skip=B101"] # assert ステートメントの B101 テストをスキップ
- repo: https://github.com/PyCQA/isort
rev: 5.12.0 # 最新の安定バージョンを使用
hooks:
- id: isort
args: ["--profile=black"] # 互換性のために Black プロファイルを使用
主な機能
"Pre-commit" パッケージの主な機能をいくつか紹介します。
- 拡張性: カスタムフックを追加する機能。
- 幅広い組み込みフック: リンティング、コードフォーマットなどを含みます。
- クロス言語サポート: Python、JavaScript、その他の言語で動作します。
ユースケース
"Pre-commit" が開発ワークフローに価値を付加する実際のユースケースについて説明します。
- コーディング標準の強制。
- フォーマットの問題を自動的に修正。
- コードコミット前にセキュリティチェックを実行。
ベストプラクティス
"Pre-commit" を最大限に活用する方法に関するヒントを提供します。
- フックのバージョンを定期的に更新します。
--all-filesフラグを使用して、コードベース全体でフックを実行します。
- CI/CD パイプラインと組み合わせて、一貫した品質チェックを行います。
カスタマイズ
"Pre-commit" パッケージは非常に柔軟性があり、開発者はプロジェクト固有の要件に対応するカスタムフックを作成できます。カスタムフックは任意の言語で記述でき、pre-commit フレームワークに簡単に統合できます。
カスタムフックの作成
カスタムフックを作成するには、次の手順に従います。
-
フックスクリプトの記述: 必要なチェックまたはアクションを実行するスクリプトを作成します。たとえば、TODO コメントをチェックする Python スクリプトは次のようになります。
#!/usr/bin/env python
import sysdef main():
for filename in sys.argv[1:]:
with open(filename) as f:
for i, line in enumerate(f, 1):
if 'TODO' in line:
print(f"TODO found in {filename}:{i}")
return 1
return 0if __name__ == '__main__':
sys.exit(main()) -
.pre-commit-config.yamlにフックを追加します。 カスタムフックを構成ファイルで定義し、スクリプトへのパスを指定します。repos:
- repo: local
hooks:
- id: check-todo
name: Check for TODO comments
entry: path/to/check_todo.py
language: python
files: \.py$ -
インストールと実行: pre-commit フックをインストールし、それらを実行してカスタムスクリプトをテストします。
pre-commit install
pre-commit run --all-files
この柔軟性により、プロジェクトに固有のチェックを自動化し、すべての開発者が同じ標準に準拠するようにすることができます。
統合
"Pre-commit" は Git などのバージョン管理システムとシームレスに統合され、既存のワークフローに簡単に組み込むことができます。いくつかの統合のヒントを次に示します。
Git 統合
-
自動フックインストール:
pre-commit installを実行すると、必要なフックがローカル Git 構成に追加されます。これにより、コミットするたびにフックが自動的に実行されます。
-
CI/CD 統合: "Pre-commit" を CI/CD パイプラインに統合して、すべてのコミットとプルリクエストでチェックを強制実行します。これにより、すべてのブランチとコントリビューターでコード品質が維持されます。
たとえば、GitHub Actions ワークフローでは、pre-commit フックを実行するステップを追加できます。
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pre-commit
- name: Run Pre-commit
run: pre-commit run --all-file
一般的なエラー
"Pre-commit" を使用すると、いくつかの一般的なエラーが発生する可能性があります。次に、それらに対する解決策とトラブルシューティングのヒントを示します。
-
フックがインストールされていません:
- エラーメッセージ:
The pre-commit hook is not installed. Run 'pre-commit install'.
- 解決策: フックがインストールされていることを確認するには、リポジトリで
pre-commit installを実行します。
- エラーメッセージ:
-
フックの失敗:
- エラーメッセージ:
Hook failed with exit code 1.
- 解決策: 出力を確認して、特定のエラーを探します。通常、ファイルが必要な標準を満たしていないことを示します。問題を修正して、もう一度コミットします。
- エラーメッセージ:
-
依存関係の不足:
- エラーメッセージ:
Command '...' not found.
- 解決策: フックに必要なすべての依存関係がインストールされていることを確認します。
additional_dependenciesキーを使用して、.pre-commit-config.yamlファイルに追加の依存関係を指定できます。
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.3.0
hooks:
- id: flake8
additional_dependencies: [flake8==3.9.0] - エラーメッセージ:
-
無効な構成:
- エラーメッセージ:
Invalid .pre-commit-config.yaml
- 解決策:
.pre-commit-config.yamlファイルの構文と構造を確認します。オンラインの YAML バリデーターを使用して、構成が有効であることを確認します。
- エラーメッセージ:
これらの一般的な問題に対処することにより、"Pre-commit" パッケージの使用中にスムーズなエクスペリエンスを確保できます。
長所と短所
"Pre-commit" パッケージのバランスの取れたビューを提供します。
長所
- コード品質を向上させます。
- 手動のコードレビュー作業を削減します。
- 幅広いフックをサポートします。
短所
- 初期セットアップ時間。
- 多くのフックによる潜在的な遅延。
他のパッケージとの比較
プロジェクトでコード品質を維持し、標準を適用する場合、いくつかのツールが利用可能です。 "Pre-commit" と、Husky や Talisman などの他の一般的なツールを比較し、その機能、ユースケース、およびそれらの相違点を強調します。
Pre-commit vs. Husky
Husky は、主に JavaScript プロジェクトで Git フックを管理するために使用される一般的なツールです。 "Pre-commit" との比較を以下に示します。
-
言語サポート:
- Pre-commit: Python、JavaScript、Ruby など、複数のプログラミング言語をサポートしています。多様な技術スタックを持つプロジェクトで使用できる汎用性があります。
- Husky: 主に JavaScript/Node.js プロジェクト向けに設計されており、npm/yarn スクリプトとの深い統合を提供します。
- Pre-commit: Python、JavaScript、Ruby など、複数のプログラミング言語をサポートしています。多様な技術スタックを持つプロジェクトで使用できる汎用性があります。
-
構成:
- Pre-commit: 言語に依存しないわかりやすい構成ファイル
.pre-commit-config.yamlを使用します。
- Husky: 構成は、
package.jsonまたは別の構成ファイル(.huskyrc)で実行されることが多く、Node.js 開発者にとってより親しみやすくなっています。
- Pre-commit: 言語に依存しないわかりやすい構成ファイル
-
組み込みフック:
- Pre-commit: リンティング、フォーマット、セキュリティチェックなど、さまざまなタスク向けの幅広い組み込みフックを提供します。
- Husky: 組み込みフックは提供されていませんが、カスタムスクリプトの実行を許可するため、JavaScript プロジェクトに非常に柔軟です。
- Pre-commit: リンティング、フォーマット、セキュリティチェックなど、さまざまなタスク向けの幅広い組み込みフックを提供します。
-
コミュニティとエコシステム:
- Pre-commit: 大きなコミュニティがあり、多くのコミュニティが保守するフックをサポートしているため、さまざまなプロジェクトに適しています。
- Husky: JavaScript エコシステムで広く採用されており、強力なコミュニティサポートと頻繁な更新が行われています。
- Pre-commit: 大きなコミュニティがあり、多くのコミュニティが保守するフックをサポートしているため、さまざまなプロジェクトに適しています。
Pre-commit vs. Talisman
Talisman は、機密情報がリポジトリにコミットされるのを防ぐことに重点を置いたツールです。 "Pre-commit" との比較を以下に示します。
-
目的:
- Pre-commit: さまざまなコード品質標準とチェックを適用できる汎用ツール。
- Talisman: コミット前に、API キーや資格情報などの秘密と機密データをコードでスキャンすることに特化しています。
- Pre-commit: さまざまなコード品質標準とチェックを適用できる汎用ツール。
-
統合:
- Pre-commit: 複数の言語と簡単に統合でき、さまざまなタスクのカスタムフックをサポートします。
- Talisman: 主に、潜在的に有害なデータを識別することに重点を置いたセキュリティツールであり、直接の競合相手ではなく、補完的なツールです。
- Pre-commit: 複数の言語と簡単に統合でき、さまざまなタスクのカスタムフックをサポートします。
-
ユースケース:
- Pre-commit: コード品質チェックを自動化し、コーディング標準を適用しようとしているチームに最適です。
- Talisman: セキュリティとデータ保護を優先し、機密情報の漏洩を防ぐことを優先するチームに最適です。
- Pre-commit: コード品質チェックを自動化し、コーディング標準を適用しようとしているチームに最適です。
関連する便利なパッケージ
-
説明: Black は、コードが一貫したスタイルガイドラインに従っていることを確認する、Python 用の意見の強いコードフォーマッターです。
-
Pre-commit との使用: コミットする前に Python ファイルを自動的にフォーマットし、一貫したコードスタイルを確保します。
-
Pre-commit 構成:
- repo: https://github.com/psf/black
rev: 23.7.0
hooks:
- id: black
-
説明: Flake8 は、PEP 8 スタイルガイドの適用と追加のリンティング機能を組み合わせ、Python コードのスタイルと品質をチェックするための包括的なツールです。
-
Pre-commit との使用: コミットする前に、スタイルの違反、未使用の変数、潜在的なエラーを特定して修正します。
-
Pre-commit 構成:
- repo: https://github.com/pycqa/flake8
rev: 6.1.0
hooks:
- id: flake8
-
説明: isort は、指定された順序とスタイルに従って、Python ファイルの import ステートメントを自動的にソートしてフォーマットします。
-
Pre-commit との使用: コードベース全体で一貫した import の順序を維持します。
-
Pre-commit 構成:
- repo: https://github.com/PyCQA/isort
rev: 5.12.0
hooks:
- id: isort
-
説明: Bandit は Python コードのセキュリティリンターであり、Python アプリケーションの一般的なセキュリティ問題を検出するように設計されています。
-
Pre-commit との使用: コミットする前に、潜在的なセキュリティ脆弱性についてコードを自動的にスキャンします。
-
Pre-commit 構成:
- repo: https://github.com/PyCQA/bandit
rev: 1.7.5
hooks:
- id: bandit
args: ["--skip=B101"]
-
説明: Pytest は Python 用の一般的なテストフレームワークであり、使いやすさと強力な機能で知られています。
-
Pre-commit との使用: コミットする前に、テストを自動的に実行して、コードの正確性を確認します。
-
Pre-commit 構成:
- repo: https://github.com/pre-commit/mirrors-pytest
rev: v7.4.1
hooks:
- id: pytest
結論
"Pre-commit" は、あらゆるプロジェクトのニーズに合わせて調整できる幅広い機能を提供しますが、Husky や Talisman などのツールは、特定のユースケースまたはエコシステムに対応したより専門的なものです。適切なツールの選択は、プロジェクトの要件、言語、および重点分野によって異なります。多くの場合、Talisman などの専門ツールと組み合わせて "Pre-commit" を使用すると、コード品質とセキュリティの包括的なカバレッジを提供できます。