uvでworkspacesを使用するときはuv syncに--all-packagesをつける
uv
はRustで実装された高速なPythonのパッケージ管理とプロジェクト管理を統合したツールです。
uv
を使い始めて少したちましたが、新しいツールだということもあり困ったときに情報がうまく見つからないことが多いです。
uv sync
に--all-packages
オプションをつけることでWorkspace内のすべてのパッケージの依存モジュールをインストールしてくれます。
比較的重要なオプションだと感じるのですが、執筆時点ではWorkspaceのページでは解説がなく、このオプションの存在をリファレンスで知りました。
以下では--all-packages
オプションが必要となったケースを紹介します。
kumadasu/uv-workspace-sampleに使用したサンプルをおいています。
問題設定:小さなツールを複数提供する
ここでは最小単位ということで2つのツール(tool-a
, tool-b
)を提供するプロジェクトを考えます。
- Pythonモジュールとして
tool-a
とtool-b
を作成する。 - 各ツールに依存パッケージがある。
-
uv
のWorkspaceを使用して管理する。 -
uv run tool-a
,uv run tool-b
でコマンドを実行する。
注記 筆者はPythonでのプロジェクトにあまりなれていないです。
問題設定に自信がないのですが、uv
のWorkspaceのドキュメントにあるようなアプリケーションとライブラリの構成でも--all-packages
オプションは同様に使えます。
プロジェクトの初期化
以下でプロジェクトの初期化を行います。
uv init --bare
uv init --package tool-a
uv init --package tool-b
uv add requests --directory tool-a
uv add rich --directory tool-b
uv sync --all-packages
ルートは特に機能を持たないので--bare
オプションをつけて不要なスクリプトの生成をしないようにしています。
uv add requests --directory tool-a
のオプション--directory tool-a
はディレクトリtool-a
へ移動してからコマンドを実行するオプションです。ここではtool-a
に対して依存関係を追加するために使用していますが、以下のコマンドと同義です。
cd tool-a
uv add requests
cd ..
最後のコマンドuv sync --all-packages
が今回の肝で、プロジェクトの.venv
環境ですべての依存モジュール(tool-a
, tool-b
自身を含む)が使用できるようになります。
コマンドの実行
これでもともと実行したかった uv run tool-a
でコマンドが実行できるようになります。
$ uv run tool-a
Hello from tool-a!
$ uv run tool-b
Hello from tool-b!
また、このときのプロジェクトの依存関係(uv tree
)は以下のとおりです。
$ uv tree
Resolved 12 packages in 2ms
uv-workspace-sample v0.1.0
tool-b v0.1.0
└── rich v14.1.0
├── markdown-it-py v3.0.0
│ └── mdurl v0.1.2
└── pygments v2.19.2
tool-a v0.1.0
└── requests v2.32.4
├── certifi v2025.8.3
├── charset-normalizer v3.4.3
├── idna v3.10
└── urllib3 v2.5.0
生成されたファイルの構成は以下のとおりです。uv.lock
はルートに1つだけであることがわかります。
$ tree -I '__pycache__' --prune
.
├── pyproject.toml
├── tool-a
│ ├── pyproject.toml
│ ├── README.md
│ └── src
│ └── tool_a
│ └── __init__.py
├── tool-b
│ ├── pyproject.toml
│ ├── README.md
│ └── src
│ └── tool_b
│ └── __init__.py
└── uv.lock
6 directories, 8 files
最後に
Workspaceを使用した場合にuv run xxx
が期待通り動作しなくてしばらく諦めていたのですが、リファレンスを読んでいる最中に--all-packages
オプションに気がついて解決しました。
uv
のIssue Add support for uv sync –all-packages #8739 で2024-11-02にマージされているので比較的最近のオプションなことにも驚きました。
デファクトスタンダードと呼ばれつつありますがまだ新しいツールなのだなと感じました。
今後のuv
の進化にも期待しています。