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