1日1回服用 事前承認
By khoanc, at: 2024年8月12日15:28
Estimated Reading Time: __READING_TIME__ minutes
![[One Package Per Day] Pre-Commit](/media/filer_public_thumbnails/filer_public/0d/2a/0d2a47b0-1c62-42bf-91ae-ef67015bfc00/one_package_per_day_-_pre-commit.png__1500x900_crop_subsampling-2_upscale.png)
![[One Package Per Day] Pre-Commit](/media/filer_public_thumbnails/filer_public/0d/2a/0d2a47b0-1c62-42bf-91ae-ef67015bfc00/one_package_per_day_-_pre-commit.png__400x240_crop_subsampling-2_upscale.png)
[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フレームワークに簡単に統合できます。
カスタムフックの作成
カスタムフックを作成するには、次の手順に従います。
-
フックスクリプトの作成: 必要なチェックまたはアクションを実行するスクリプトを作成します。たとえば、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と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と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は、Pythonコードのスタイルと品質をチェックするための包括的なツールであり、PEP 8スタイルガイドの適用と追加のリンティング機能を組み合わせたものです。
-
Pre-commitとの使用: コミット前にスタイル違反、未使用の変数、および潜在的なエラーを特定して修正します。
-
Pre-commit設定:
- repo: https://github.com/pycqa/flake8
rev: 6.1.0
hooks:
- id: flake8
-
説明: isortは、指定された順序とスタイルに従って、Pythonファイルのインポート文を自動的にソートしてフォーマットします。
-
Pre-commitとの使用: コードベース全体でインポートの一貫性のある順序を維持します。
-
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などのツールはより専門的で、特定のユースケースやエコシステムに対応しています。適切なツールを選択する際には、プロジェクトの要件、言語、および重点分野によって異なります。多くの場合、「Pre-commit」をTalismanなどの専門ツールと組み合わせて使用することで、コード品質とセキュリティの包括的なカバレッジを提供できます。