pre-commit
です。今回はpre-commit
と、それに付随して使うことで効果的になるblack
、isort
、mypy
、そしてbandit
について簡単に使い方と効果を紹介していきます。pre-commit
とはpre-commit
はPython製ツールで、pre-commit
フックを管理・維持するためのものです。pre-commit
フックは、Gitのようなバージョン管理システムでコミットが行われる前に自動的に実行されるスクリプトです。これらのスクリプトは、コードがコミットされる前に特定の基準を満たしているかチェックするために使われます。pre-commit
がどのように機能し、なぜ有効なのかを簡単に説明します。pre-commit
インストールpre-commit
のインストールはpip
、conda
、あるいはhomebrew
(macOSの場合)を使いましょう。$ pip install pre-commit
conda
の場合は以下です。$ conda install -c conda-forge pre-commit
homebrew
を使う場合は以下です。$ brew install pre-commit
pre-commit
が動作する流れ.pre-commit-config.yaml
ファイルをリポジトリに追加します。このファイルで使用するフックを指定します。pre-commit install
コマンドでフックをインストールします。これにより、コミット前に指定したスクリプトを実行するようgit
のフックが設定されます。.pre-commit-config.yaml
ファイルで指定したフックが実行されます。いずれかのフックが失敗するとコミットは中断され、指定した条件を満たすコードのみがコミットされるようになります。pre-commit autoupdate
コマンドを使って新しいバージョンに更新できます。pre-commit
のメリットpre-commit
はflake8
やblack
のような一般的なlinterからカスタムスクリプトまで、幅広いフックをサポートしています。black
= 一貫したコード書式を保証するコードフォーマッター(整形)flake8
= Pythonコードの文法エラーや論理エラーをチェックするlinterisort
= Pythonのインポートを一貫性のある方法でソートmypy
= Pythonの静的型チェッカーbandit
= セキュリティ脆弱性のスキャンpre-commit
がインストールされていることを確認してください。$ pre-commit --version
.pre-commit-config.yaml
ファイル作成.pre-commit-config.yaml
ファイルを作成します。repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.5.0 # 最新版を指定
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- repo: https://github.com/psf/black
rev: 23.10.0 # 最新版を指定
hooks:
- id: black
language_version: python3.11 # Pythonのバージョンを指定
- repo: https://github.com/pycqa/flake8
rev: 6.1.0 # 最新版を指定
hooks:
- id: flake8
- repo: https://github.com/pycqa/isort
rev: v5.11.2 # 最新版を指定
hooks:
- id: isort
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.6.1 # 最新版を指定
hooks:
- id: mypy
- repo: https://github.com/PyCQA/bandit
rev: 1.7.5 # 最新版を指定
hooks:
- id: bandit
args: ["-r", "."] # 再帰的に現在のディレクトリをスキャン
$ pre-commit install
pre-commit installed at .git/hooks/pre-commit
README.md
を作成してコミットします。$ touch README.md
$ git add README.md
$ git commit -m 'add readme'
.pre-commit-config.yaml
に書いた内容がインストールされます。[INFO] Initializing environment for https://github.com/pre-commit/pre-commit-hooks.
[INFO] Initializing environment for https://github.com/psf/black.
[INFO] Initializing environment for https://github.com/pycqa/flake8.
[INFO] Initializing environment for https://github.com/pycqa/isort.
[INFO] Initializing environment for https://github.com/pre-commit/mirrors-mypy.
[INFO] Initializing environment for https://github.com/PyCQA/bandit.
[INFO] Installing environment for https://github.com/pre-commit/pre-commit-hooks.
...[中略]...
trim trailing whitespace.................................................Passed
fix end of files.........................................................Passed
black................................................(no files to check)Skipped
flake8...............................................(no files to check)Skipped
isort................................................(no files to check)Skipped
mypy.................................................(no files to check)Skipped
bandit...............................................(no files to check)Skipped
Passed
(成功)かSkipped
(スキップ)となります。pre-commit
を参考にどのように修正していくかpre-commit
フックが実行されます。pre-commit
を活用しようpre-commit
はPythonプロジェクトのコード品質を維持する強力なツールです。pre-commit
は早い段階で取り入れるべきツールだと断言できます。black
、flake8
などの複数のツールとpre-commit
を統合することで、一括管理できるため、チェックの忘れ防止にも効果的です。安全性が保証と全体的な開発体験の向上を目指して、ぜひpre-commit
の導入を検討してみてください。