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の進化にも期待しています。