仮想環境を持つ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ライブラリやアプリケーションを管理する場合に使用します。

試してみる — Makefile Generator

フルツールを開く