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.txtuvとは?
- 新しい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+機能が現在のスタンダードなソリューションとして推奨されます。