1日に1つパッケージ Pre-Commit

By khoanc, at: 2024年8月12日15:28

予想読書時間: __READING_TIME__ 分

[One Package Per Day] Pre-Commit
[One Package Per Day] Pre-Commit

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 フレームワークに簡単に統合できます。

 

カスタムフックの作成

 

カスタムフックを作成するには、次の手順に従います。

 

  1. フックスクリプトの記述: 必要なチェックまたはアクションを実行するスクリプトを作成します。たとえば、TODO コメントをチェックする Python スクリプトは次のようになります。

    #!/usr/bin/env python
    import sys

    def 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 0

    if __name__ == '__main__':
        sys.exit(main())

  2. .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$
  3. インストールと実行: 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" を使用すると、いくつかの一般的なエラーが発生する可能性があります。次に、それらに対する解決策とトラブルシューティングのヒントを示します。

 

  1. フックがインストールされていません:

    • エラーメッセージ: The pre-commit hook is not installed. Run 'pre-commit install'.
       
    • 解決策: フックがインストールされていることを確認するには、リポジトリで pre-commit install を実行します。
       
  2. フックの失敗:

    • エラーメッセージ: Hook failed with exit code 1.
       
    • 解決策: 出力を確認して、特定のエラーを探します。通常、ファイルが必要な標準を満たしていないことを示します。問題を修正して、もう一度コミットします。
       
  3. 依存関係の不足:

    • エラーメッセージ: 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]
  4. 無効な構成:

    • エラーメッセージ: Invalid .pre-commit-config.yaml
       
    • 解決策: .pre-commit-config.yaml ファイルの構文と構造を確認します。オンラインの YAML バリデーターを使用して、構成が有効であることを確認します。
       

これらの一般的な問題に対処することにより、"Pre-commit" パッケージの使用中にスムーズなエクスペリエンスを確保できます。

 

長所と短所

 

"Pre-commit" パッケージのバランスの取れたビューを提供します。

 

長所

  • コード品質を向上させます。
     
  • 手動のコードレビュー作業を削減します。
     
  • 幅広いフックをサポートします。
     

短所

  • 初期セットアップ時間。
     
  • 多くのフックによる潜在的な遅延。

 

他のパッケージとの比較

 

プロジェクトでコード品質を維持し、標準を適用する場合、いくつかのツールが利用可能です。 "Pre-commit" と、HuskyTalisman などの他の一般的なツールを比較し、その機能、ユースケース、およびそれらの相違点を強調します。

 

Pre-commit vs. Husky

 

Husky は、主に JavaScript プロジェクトで Git フックを管理するために使用される一般的なツールです。 "Pre-commit" との比較を以下に示します。

 

  • 言語サポート:

    • Pre-commit: Python、JavaScript、Ruby など、複数のプログラミング言語をサポートしています。多様な技術スタックを持つプロジェクトで使用できる汎用性があります。
       
    • Husky: 主に JavaScript/Node.js プロジェクト向けに設計されており、npm/yarn スクリプトとの深い統合を提供します。
       
  • 構成:

    • Pre-commit: 言語に依存しないわかりやすい構成ファイル .pre-commit-config.yaml を使用します。
       
    • Husky: 構成は、package.json または別の構成ファイル(.huskyrc)で実行されることが多く、Node.js 開発者にとってより親しみやすくなっています。
       
  • 組み込みフック:

    • Pre-commit: リンティング、フォーマット、セキュリティチェックなど、さまざまなタスク向けの幅広い組み込みフックを提供します。
       
    • Husky: 組み込みフックは提供されていませんが、カスタムスクリプトの実行を許可するため、JavaScript プロジェクトに非常に柔軟です。
       
  • コミュニティとエコシステム:

    • Pre-commit: 大きなコミュニティがあり、多くのコミュニティが保守するフックをサポートしているため、さまざまなプロジェクトに適しています。
       
    • Husky: JavaScript エコシステムで広く採用されており、強力なコミュニティサポートと頻繁な更新が行われています。

 

Pre-commit vs. Talisman

 

Talisman は、機密情報がリポジトリにコミットされるのを防ぐことに重点を置いたツールです。 "Pre-commit" との比較を以下に示します。

 

  • 目的:

    • Pre-commit: さまざまなコード品質標準とチェックを適用できる汎用ツール。
       
    • Talisman: コミット前に、API キーや資格情報などの秘密と機密データをコードでスキャンすることに特化しています。
       
  • 統合:

    • Pre-commit: 複数の言語と簡単に統合でき、さまざまなタスクのカスタムフックをサポートします。
       
    • Talisman: 主に、潜在的に有害なデータを識別することに重点を置いたセキュリティツールであり、直接の競合相手ではなく、補完的なツールです。
       
  • ユースケース:

    • Pre-commit: コード品質チェックを自動化し、コーディング標準を適用しようとしているチームに最適です。
       
    • Talisman: セキュリティとデータ保護を優先し、機密情報の漏洩を防ぐことを優先するチームに最適です。

 

関連する便利なパッケージ

 

Black

 

  • 説明: Black は、コードが一貫したスタイルガイドラインに従っていることを確認する、Python 用の意見の強いコードフォーマッターです。

  • Pre-commit との使用: コミットする前に Python ファイルを自動的にフォーマットし、一貫したコードスタイルを確保します。

  • Pre-commit 構成:

    - repo: https://github.com/psf/black
      rev: 23.7.0
      hooks:
        - id: black

 

Flake8

 

  • 説明: Flake8 は、PEP 8 スタイルガイドの適用と追加のリンティング機能を組み合わせ、Python コードのスタイルと品質をチェックするための包括的なツールです。

  • Pre-commit との使用: コミットする前に、スタイルの違反、未使用の変数、潜在的なエラーを特定して修正します。

  • Pre-commit 構成:

    - repo: https://github.com/pycqa/flake8
      rev: 6.1.0
      hooks:
        - id: flake8

 

isort

 

  • 説明: isort は、指定された順序とスタイルに従って、Python ファイルの import ステートメントを自動的にソートしてフォーマットします。

  • Pre-commit との使用: コードベース全体で一貫した import の順序を維持します。

  • Pre-commit 構成:

    - repo: https://github.com/PyCQA/isort
      rev: 5.12.0
      hooks:
        - id: isort

 

bandit

 

  • 説明: Bandit は Python コードのセキュリティリンターであり、Python アプリケーションの一般的なセキュリティ問題を検出するように設計されています。

  • Pre-commit との使用: コミットする前に、潜在的なセキュリティ脆弱性についてコードを自動的にスキャンします。

  • Pre-commit 構成:

    - repo: https://github.com/PyCQA/bandit
      rev: 1.7.5
      hooks:
        - id: bandit
          args: ["--skip=B101"]

 

pytest

 

  • 説明: Pytest は Python 用の一般的なテストフレームワークであり、使いやすさと強力な機能で知られています。

  • Pre-commit との使用: コミットする前に、テストを自動的に実行して、コードの正確性を確認します。

  • Pre-commit 構成:

    - repo: https://github.com/pre-commit/mirrors-pytest
      rev: v7.4.1
      hooks:
        - id: pytest

 

結論

 

"Pre-commit" は、あらゆるプロジェクトのニーズに合わせて調整できる幅広い機能を提供しますが、HuskyTalisman などのツールは、特定のユースケースまたはエコシステムに対応したより専門的なものです。適切なツールの選択は、プロジェクトの要件、言語、および重点分野によって異なります。多くの場合、Talisman などの専門ツールと組み合わせて "Pre-commit" を使用すると、コード品質とセキュリティの包括的なカバレッジを提供できます。

 

Tag list:
- git
- git hooks
- coding style
- Python clean code
- Python coding style
- hooks install
- Python linter
- pre-commit
- pre-commit install
- Pre-Commit
- pre-commit hooks
- git hooks setup
- isort
- Python linting
- Python code quality
- Code formatting
- Bandit
- git hooks python
- Python development tools
- Black formatter
- Automated code checks
- Flake8

Related

Django

もっと読む
Django rest framework Django

もっと読む

購読

最新の当社の情報を受け取るために、購読してください。