1日1回服用 事前承認

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

Estimated Reading Time: __READING_TIME__ minutes

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

[1日1パッケージ] 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と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と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は、Pythonコードのスタイルと品質をチェックするための包括的なツールであり、PEP 8スタイルガイドの適用と追加のリンティング機能を組み合わせたものです。

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

  • Pre-commit設定:

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

 

isort

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

  • Pre-commitとの使用: コードベース全体でインポートの一貫性のある順序を維持します。

  • 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などのツールはより専門的で、特定のユースケースやエコシステムに対応しています。適切なツールを選択する際には、プロジェクトの要件、言語、および重点分野によって異なります。多くの場合、「Pre-commit」をTalismanなどの専門ツールと組み合わせて使用することで、コード品質とセキュリティの包括的なカバレッジを提供できます。

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 Python

Read more
Django

Read more
Django rest framework Django

Read more
Subscribe

Subscribe to our newsletter and never miss out lastest news.