できない.dev

uv sync / uv add が「No pyproject.toml found」で実行できない

No pyproject.toml found は、pyproject.toml のある場所で実行するか --project で指定すれば直る。
requirements.txt だけの構成なら uv init で作る。

公開:

要約

uv sync や uv add を実行すると、何もせずに止まる(終了コード 2)。

error: No `pyproject.toml` found in current directory or any parent directory

uv sync・uv add・uv lock・uv tree は、pyproject.toml で依存を管理するプロジェクトを前提にしたコマンドだ。
カレントディレクトリから親ディレクトリへ順に pyproject.toml を探し、どこにも無ければこのエラーになる。
上の表示は uv 0.13.0 で、空のディレクトリと requirements.txt だけを置いたディレクトリの両方で同じものが出た。
4 つのコマンドとも表示と終了コードは同じだった。

一方で、uv run と uv pip install はプロジェクトが無くても動く。
同じディレクトリで uv run は通るのに uv sync だけ止まる、という見え方になる。

解決策

1. 場所を合わせる

pyproject.toml のあるディレクトリに移動して実行する。
移動できないスクリプトや CI では、--project でプロジェクトの場所を渡す。
ルート(/)から実行しても通った。

uv sync --project /app

2. requirements.txt のまま使う

プロジェクトにしないなら、pip 互換のコマンドを使う。
こちらは仮想環境が必要なので、先に uv venv を実行する。uv pip install -r は書かれていないパッケージを残すが、uv pip sync は環境をファイルの内容にそろえる(Locking environments(新しいタブで開く))。

uv venv
uv pip sync requirements.txt      # requirements.txt と完全に同じ状態にする
uv pip install -r requirements.txt  # 足りないものだけ入れる

3. プロジェクトに移行する

uv sync や uv add を使いたいなら、pyproject.toml を作って依存を取り込む。移行ガイド(新しいタブで開く)の手順どおり、uv add -r で既存のファイルを読み込める。

uv init --bare
uv add -r requirements.txt

--bare は pyproject.toml だけを作る(Creating projects(新しいタブで開く))。
付けない uv init は、.python-version・README.md・src/ 以下のパッケージも作る。uv add の後は依存が pyproject.toml に書かれ、uv.lock と .venv もできるので、以後は uv sync が通る。

よくある原因

  1. 実行している場所が違う: リポジトリの外や、Dockerfile の WORKDIR がプロジェクトと別の場所になっている。
    親ディレクトリにある pyproject.toml は見つかるので、プロジェクトの中のサブディレクトリで実行した場合は通る。
  2. requirements.txt で管理している: pip の流儀のディレクトリで、uv のプロジェクト用コマンドを使っている。uv sync は requirements.txt を読まない。
  3. プロジェクトをまだ作っていない: uv init を実行していない。

この手順で直った?