8月21日、「uv: Unified Python packaging」と題した記事を公開した。
uvは、Rustで書かれた非常に高速なPythonパッケージマネージャーであり、2024年2月に一般的なpip
ワークフローの代替としてリリースされた。当初はpip
の置き換えとして設計されたが、今回のアップデートにより、Pythonプロジェクトの管理、コマンドラインツールの管理、単一ファイルスクリプトの管理、さらにはPython自体のインストールまでサポートするようになった。
主な機能
プロジェクト管理
uvは、プロジェクト全体を管理できるようになった。標準準拠のメタデータに基づいてクロスプラットフォームのロックファイルを生成し、プロジェクトの依存関係を高速に解決する。PoetryやPDM、Ryeといったツールの高性能な代替手段となり得る。
以下は、fastapi
という依存関係を追加した際のpyproject.toml
の例である。
[project]
name = "hello-world"
version = "0.1.0"
readme = "README.md"
dependencies = ["fastapi>=0.112"]
uvは、プロジェクトの依存関係を基にロックファイルを作成し、次のような内容が含まれる。
[[package]]
name = "fastapi"
version = "0.112.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pydantic" },
{ name = "starlette" },
{ name = "typing-extensions" },
]
このロックファイルは、プロジェクトの依存関係を完全に解決したスナップショットであり、クロスプラットフォームで一貫性のある環境を提供する。
また、uvは非常に高速であり、キャッシュなしでもJupyterプロジェクトの依存関係を約0.5秒で解決できる。
依存関係のソース管理: editables、相対パスなど
uvはPythonの標準に準拠しつつ、ローカル開発において重要な機能を追加している。例えば、相対パスや編集可能な依存関係を使って開発環境を柔軟に管理できる。
[project]
name = "hello-world"
version = "0.1.0"
readme = "README.md"
dependencies = ["anyio"]
[tool.uv.sources]
anyio = { path = "../anyio", editable = true }
上記の例では、ローカルの../anyio
を編集可能な状態で使用する設定が追加されている。これにより、開発中のパッケージを即座に反映しつつ、プロジェクトの依存関係は保持される。
詳細は依存関係ソースのドキュメントを参照していただきたい。
ワークスペースの管理
uvは、RustのCargoに触発され、ワークスペースという概念をサポートしている。これは、複数のパッケージを一括管理する仕組みで、複雑なプロジェクトにも対応できる。
例えば、FastAPIベースのウェブアプリケーションと、それに関連するライブラリを一つのワークスペース内で管理することが可能である。
[project]
name = "fastapi"
version = "0.1.0"
readme = "README.md"
dependencies = ["uvicorn"]
[tool.uv.sources]
uvicorn = { workspace = true }
[tool.uv.workspace]
members = ["libraries/*"]
この設定により、ワークスペース内の任意のメンバーでコマンドを実行することができ、統一された依存関係の管理が実現する。詳細はワークスペースのドキュメントを参照していただきたい。
uvxコマンド: インストールなしで実行可能
uvは、コマンドラインツールを専用の仮想環境にインストールし、インストールせずに一時的にコマンドを実行する機能を備えている。この機能は、pipxやnpxといったツールの代替として非常に高速であり、システム上のPythonアプリケーションを中央で管理するための一貫したインターフェースを提供する。
例えば、以下のようにpostingモジュールをインストールせずに実行できる。
uvx posting
Python自体のインストール
uvは、Python自体のインストールと管理もサポートしており、完全に自己ブートストラップ可能である。uv python installコマンドを使用することで、Pythonの特定バージョンをインストールでき、これによりpyenvのようなツールの代替となる。
例えば以下のように簡単にPython 3.12をインストールできる。
$ curl -LsSf https://astral.sh/uv/install.sh | sh
$ uv python install 3.12
単一ファイルスクリプトの実行
uvは、PEP 723に基づくインライン依存関係メタデータを持つ単一ファイルのPythonスクリプトを管理できる。これにより、仮想環境や依存関係の管理を気にすることなく、独立した環境でスクリプトを実行できる。
例えば、以下のスクリプトは、requests
とrich
を使用してPEPのリストを取得する。
import requests
from rich.pretty import pprint
resp = requests.get("https://peps.python.org/api/peps.json")
data = resp.json()
pprint([(k, v["title"]) for k, v in data.items()][:10])
これに依存関係を追加するには、次のコマンドを使用する。
uv add --script main.py "requests" "rich"
これにより、スクリプト内に依存関係が自動的に埋め込まれる。
# /// script
# requires-python = ">=3.12"
# dependencies = [
# "requests",
# "rich",
# ]
# ///
import requests
from rich.pretty import pprint
resp = requests.get("https://peps.python.org/api/peps.json")
data = resp.json()
pprint([(k, v["title"]) for k, v in data.items()][:10])
その後、uv run main.py
を実行すると、このスクリプトが孤立した仮想環境で実行される。
スケールに対応した設計
uvは、初心者にも使いやすいツールでありながら、大規模なPythonプロジェクトのニーズにも対応できるように設計されている。
詳細はuv: Unified Python packagingを参照していただきたい。