pyproject.tomlでrequirements.txtを参照する方法
Pythonプロジェクトをsetup.py
から現代的なpyproject.toml
設定に移行する際、pip-compile
で生成されたrequirements.txt
を依存関係として参照したい場合があります。この方法は、完全な依存関係の固定による再現可能なインストールや依存関係衝突の理解といったメリットがあります。
解決策1: setuptoolsの動的メタデータを使用(推奨)
setuptools 62.6以降では、file
ディレクティブを使用して外部ファイルから依存関係を読み込めます。
toml
[build-system]
requires = ["setuptools>=62.6"]
build-backend = "setuptools.build_meta"
[project]
name = "my-project"
version = "1.0.0"
dynamic = ["dependencies"]
[tool.setuptools.dynamic]
dependencies = { file = ["requirements.txt"] }
重要ポイント
- setuptoolsバージョン要件: v62.6以上が必須
- requirements.txtの形式:
- PEP 508準拠(
package==version
のような形式) -r
、-c
、-e
フラグは非対応
- PEP 508準拠(
- sdistへの自動追加 (v66.1.0以上):toml
requires = ["setuptools>=66.1.0"]
- 開発用依存関係の追加:toml
[project] dynamic = ["dependencies", "optional-dependencies"] [tool.setuptools.dynamic] dependencies = { file = ["requirements.txt"] } optional-dependencies = { dev = { file = ["requirements-dev.txt"] } }
制限事項
- オプション依存関係を動的指定する場合、すべてのグループを動的に宣言する必要があります(一部を静的定義できません)
- requirements.txt内のコメントは無視されます
解決策2: Hatchビルドシステムの使用
setuptools以外のビルドシステム(例: Hatch)を使用する場合:
toml
[build-system]
requires = ["hatchling", "hatch-requirements-txt"]
build-backend = "hatchling.build"
[project]
name = "my-project"
version = "1.0.0"
dynamic = ["dependencies"]
[tool.hatch.metadata.hooks.requirements_txt]
files = ["requirements.txt"]
特徴
- hatch-requirements-txtプラグインが必須
- 独立した依存関係管理が可能
- setuptoolsとは互換性がありません
補足ツール: uvを使用した依存関係追加
uv
ツールでrequirements.txt
から依存関係を追加:
bash
uv add -r requirements.txt
uvとは?
- 新しいPythonパッケージマネージャ(Astral社開発)
pip
やpip-tools
より高速- プロジェクト設定変更ではなく一時的な依存関係追加に有用
ベストプラクティスと注意点
pip-toolsとの統合:
bashpip-compile pyproject.toml # 直接TOMLから生成
requirements.in
ファイルが不要に- 注意: 完全固定依存関係はライブラリ開発では非推奨
バージョン管理戦略:
- ライブラリプロジェクト: 緩いバージョン制約を使用
- アプリケーションプロジェクト: 厳密なピン止めを実施
セキュリティ監視:
bashpip-audit -r requirements.txt
ワークフロー例:
非推奨のアプローチ
setup.py
に頼らないこと- 手動での依存関係重複管理は不整合リスクあり
どのアプローチも、プロジェクトタイプ(ライブラリ vs アプリケーション)と使用ツールチェーンに応じて選択してください。setuptools 62.6+機能が現在のスタンダードなソリューションとして推奨されます。