Skip to content

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 freezeuv pip freeze > requirements.txt環境のスナップショットを直接出力
uv exportuv export --format requirements.txt > ...出力形式と内容を詳細にカスタマイズ可能
uv pip compileuv pip compile pyproject.toml ...元の原因。pyproject.tomlのみを参照

注意点

  1. 環境非依存の生成
    uv pip freezeは現在の仮想環境に基づくため、クリーンな環境で実行する必要があります:

    bash
    python -m venv .venv
    source .venv/bin/activate
    uv pip install -r requirements.txt
  2. プロダクション向け最適化
    本番環境ではパフォーマンスとセキュリティ向上のために:

    bash
    uv export --no-dev --no-hashes --format requirements.txt > requirements.txt
  3. ハッシュが必要な場合
    完全な再現性が必要な場合はハッシュを含めます:

    bash
    uv pip freeze > requirements.txt  # デフォルトでハッシュを含む

ベストプラクティス

  1. ワークフローの統一

  2. CI/CDパイプライン例:

    bash
    # 依存関係更新ジョブ
    - name: Update requirements
      run: |
        uv lock --upgrade
        uv pip freeze > requirements.txt