仮想環境を持つPythonプロジェクトのMakefile
仮想環境の管理、pip依存関係、pytestでのテスト、flake8/mypyでのlint、パッケージングを含むPythonプロジェクト用Makefileを構築します。
Language-Specific
詳細な説明
MakeによるPython開発
PythonプロジェクトはMakefileから大きな恩恵を受けます。仮想環境の作成、依存関係のインストール、lint、テスト、パッケージングがすべて単一のコマンドになります。
仮想環境の管理
PYTHON ?= python3
VENV = .venv
BIN = $(VENV)/bin
$(VENV)/bin/activate: requirements.txt
$(PYTHON) -m venv $(VENV)
$(BIN)/pip install --upgrade pip
$(BIN)/pip install -r requirements.txt
@touch $(VENV)/bin/activate
venv: $(VENV)/bin/activate
このターゲットはrequirements.txtを依存関係として追跡します。仮想環境は要件が変更された場合にのみ再作成されます。@touchは正確な依存関係チェックのためにactivationスクリプトの変更時間を更新します。
テストとlint
test: venv
$(BIN)/python -m pytest tests/ -v --cov=src --cov-report=html
lint: venv
$(BIN)/python -m flake8 src/ tests/
$(BIN)/python -m mypy src/
$(BIN)/python -m black --check src/ tests/
format: venv
$(BIN)/python -m black src/ tests/
$(BIN)/python -m isort src/ tests/
すべてのツールは仮想環境から実行され、一貫したバージョンが保証されます。lintターゲットは複数のチェックをチェーンします。いずれかが失敗すると、後続のものは実行されません。
パッケージング
dist: venv
$(BIN)/python -m build
publish: dist
$(BIN)/python -m twine upload dist/*
wheelとソースディストリビューションをビルドし、PyPIにアップロードします。publishターゲットはdistに依存しており、パッケージが先にビルドされることを保証します。
開発ワークフロー
run: venv
$(BIN)/python src/main.py
shell: venv
$(BIN)/ipython
clean:
rm -rf $(VENV) dist build *.egg-info .pytest_cache .mypy_cache htmlcov
find . -name '*.pyc' -delete
find . -type d -name '__pycache__' -exec rm -rf {} +
cleanターゲットは仮想環境、ビルド成果物、すべてのコンパイル済みPythonファイル(.pyc)を削除します。
ベストプラクティス
- venvをactivateする代わりに常に
$(BIN)/pythonを使用し、activateをsourceせずにMakeコマンドが動作するようにする - 再現性のために
requirements.txtに正確な依存関係バージョンをピンする - 開発用依存関係は
requirements-dev.txtに分離する
ユースケース
再現可能な仮想環境セットアップ、カバレッジ付きの自動テスト、mypyによる型チェック、PyPI向けのワンコマンドパッケージングが必要なPythonライブラリやアプリケーションを管理する場合に使用します。