requirements.txtの更新(uv)
Pythonプロジェクトでuv
を使用してパッケージを管理している場合、本番環境がpip
を利用しているとrequirements.txt
の更新が必要になります。uv.lock
ファイルは更新されるもののuv pip compile
で生成されるrequirements.txt
が最新バージョンに追従しない場合の解決法を解説します。
問題の概要
uv lock --upgrade
でパッケージをアップグレードしuv.lock
が更新されたにもかかわらず、次のコマンドで生成されるrequirements.txt
が古いバージョンのままになる現象が発生します:
bash
uv pip compile pyproject.toml --output-file requirements.txt
例:dj-database-url
がv2.3.0に更新されているのにrequirements.txt
ではv2.2.0が指定され続ける。
解決方法
uv.lock
の内容を直接requirements.txt
形式で出力する専用コマンドを使用します。
推奨方法: uv pip freeze
(シンプルで効果的)
現在の環境の依存関係を直接出力:
bash
uv pip freeze > requirements.txt
特徴
- 即時反映:
uv.lock
の変更が即座に適用 - 最小限のコマンド: 追加オプション不要
- ハッシュを含む: セキュアな本番環境向け
代替方法: uv export
(より細かい制御が必要な場合)
requirements.txt
形式で依存関係をエクスポート:
bash
uv export --format requirements.txt > requirements.txt
追加オプション例
bash
# ハッシュなしで出力
uv export --no-hashes --format requirements.txt > requirements.txt
# dev依存関係を除外
uv export --no-dev --format requirements.txt > requirements.txt
# 完全カスタマイズ例
uv export --no-hashes --no-annotate --no-header --no-dev --format requirements.txt > requirements-prod.txt
各方法の違い
方法 | コマンド例 | 特徴 |
---|---|---|
uv pip freeze | uv pip freeze > requirements.txt | 環境のスナップショットを直接出力 |
uv export | uv export --format requirements.txt > ... | 出力形式と内容を詳細にカスタマイズ可能 |
uv pip compile | uv pip compile pyproject.toml ... | 元の原因。pyproject.toml のみを参照 |
注意点
環境非依存の生成
uv pip freeze
は現在の仮想環境に基づくため、クリーンな環境で実行する必要があります:bashpython -m venv .venv source .venv/bin/activate uv pip install -r requirements.txt
プロダクション向け最適化
本番環境ではパフォーマンスとセキュリティ向上のために:bashuv export --no-dev --no-hashes --format requirements.txt > requirements.txt
ハッシュが必要な場合
完全な再現性が必要な場合はハッシュを含めます:bashuv pip freeze > requirements.txt # デフォルトでハッシュを含む
ベストプラクティス
ワークフローの統一
CI/CDパイプライン例:
bash# 依存関係更新ジョブ - name: Update requirements run: | uv lock --upgrade uv pip freeze > requirements.txt