Skip to content

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 フラグは非対応
  • 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"]

特徴

  1. hatch-requirements-txtプラグインが必須
  2. 独立した依存関係管理が可能
  3. setuptoolsとは互換性がありません

補足ツール: uvを使用した依存関係追加

uvツールでrequirements.txtから依存関係を追加:

bash
uv add -r requirements.txt

uvとは?

  • 新しいPythonパッケージマネージャ(Astral社開発)
  • pippip-toolsより高速
  • プロジェクト設定変更ではなく一時的な依存関係追加に有用

ベストプラクティスと注意点

  1. pip-toolsとの統合:

    bash
    pip-compile pyproject.toml  # 直接TOMLから生成
    • requirements.inファイルが不要に
    • 注意: 完全固定依存関係はライブラリ開発では非推奨
  2. バージョン管理戦略:

    • ライブラリプロジェクト: 緩いバージョン制約を使用
    • アプリケーションプロジェクト: 厳密なピン止めを実施
  3. セキュリティ監視:

    bash
    pip-audit -r requirements.txt
  4. ワークフロー例:

非推奨のアプローチ

  • setup.pyに頼らないこと
  • 手動での依存関係重複管理は不整合リスクあり

どのアプローチも、プロジェクトタイプ(ライブラリ vs アプリケーション)と使用ツールチェーンに応じて選択してください。setuptools 62.6+機能が現在のスタンダードなソリューションとして推奨されます。