751 lines
16 KiB
Markdown
751 lines
16 KiB
Markdown
---
|
|
name: uv
|
|
description: Expert guidance for Astral's uv - an extremely fast Python package and project manager. Use when working with Python projects, managing dependencies, creating scripts with PEP 723 metadata, installing tools, managing Python versions, or configuring package indexes. Covers project initialization, dependency management, virtual environments, tool installation, workspace configuration, CI/CD integration, and migration from pip/poetry.
|
|
---
|
|
|
|
# uv: Modern Python Package and Project Manager
|
|
|
|
## Overview
|
|
|
|
uv is Astral's extremely fast Python package and project manager written in Rust, designed as a unified replacement for pip, pip-tools, pipx, poetry, pyenv, and virtualenv. It delivers 10-100x faster performance while providing modern dependency management with lockfiles and reproducible environments.
|
|
|
|
## When to Use This Skill
|
|
|
|
Use this skill when:
|
|
|
|
- Initializing new Python projects or scripts
|
|
- Managing project dependencies with pyproject.toml
|
|
- Creating portable single-file scripts with PEP 723 inline metadata
|
|
- Installing or running command-line tools (ruff, black, httpie, etc.)
|
|
- Managing Python interpreter versions
|
|
- Setting up virtual environments
|
|
- Configuring package indexes or private registries
|
|
- Migrating from pip, pip-tools, poetry, or conda
|
|
- Configuring CI/CD pipelines for Python projects
|
|
- Setting up Docker containers for Python applications
|
|
- Troubleshooting dependency resolution or build failures
|
|
|
|
## Core Capabilities
|
|
|
|
### 1. Project Initialization and Management
|
|
|
|
**Initialize new projects:**
|
|
|
|
```bash
|
|
# Standard project with recommended structure
|
|
uv init myproject
|
|
|
|
# Application project (default)
|
|
uv init myapp --app
|
|
|
|
# Library/package project (includes src/ layout)
|
|
uv init mylib --lib --build-backend hatchling
|
|
|
|
# Bare project (pyproject.toml only)
|
|
uv init --bare
|
|
```
|
|
|
|
**Project structure created:**
|
|
|
|
```text
|
|
myproject/
|
|
├── .venv/ # Virtual environment (auto-created)
|
|
├── .python-version # Pinned Python version
|
|
├── README.md
|
|
├── main.py # Sample entry point
|
|
├── pyproject.toml # Project metadata and dependencies
|
|
└── uv.lock # Lockfile (like Cargo.lock or package-lock.json)
|
|
```
|
|
|
|
### 2. Dependency Management
|
|
|
|
**Add dependencies to project:**
|
|
|
|
```bash
|
|
# Production dependencies
|
|
uv add requests 'flask>=2.0,<3.0' pydantic
|
|
|
|
# Development dependencies
|
|
uv add --dev pytest pytest-cov ruff mypy black
|
|
|
|
# Optional dependency groups
|
|
uv add --group docs sphinx sphinx-rtd-theme
|
|
uv add --group test pytest-asyncio hypothesis
|
|
|
|
# From various sources
|
|
uv add git+https://github.com/psf/requests@main
|
|
uv add --editable ./local-package
|
|
uv add ../sibling-package
|
|
```
|
|
|
|
**Remove dependencies:**
|
|
|
|
```bash
|
|
uv remove requests flask
|
|
uv remove --dev pytest
|
|
uv remove --group docs sphinx
|
|
```
|
|
|
|
**Lock and sync environments:**
|
|
|
|
```bash
|
|
# Update lockfile with latest compatible versions
|
|
uv lock
|
|
|
|
# Upgrade all packages
|
|
uv lock --upgrade
|
|
|
|
# Upgrade specific packages
|
|
uv lock --upgrade-package requests --upgrade-package flask
|
|
|
|
# Install all dependencies from lockfile
|
|
uv sync
|
|
|
|
# Install without dev dependencies (production)
|
|
uv sync --no-dev
|
|
|
|
# Install with optional groups
|
|
uv sync --extra docs --extra test
|
|
|
|
# Sync without updating lockfile (CI mode)
|
|
uv sync --frozen
|
|
|
|
# Error if lockfile out of sync (strict CI mode)
|
|
uv sync --locked
|
|
```
|
|
|
|
### 3. Running Code in Project Context
|
|
|
|
**Execute scripts and commands:**
|
|
|
|
```bash
|
|
# Run Python script in project environment
|
|
uv run python script.py
|
|
|
|
# Run module (like python -m)
|
|
uv run -m pytest
|
|
uv run -m flask run --port 8000
|
|
|
|
# Run with specific Python version
|
|
uv run --python 3.11 script.py
|
|
uv run --python pypy@3.9 test.py
|
|
|
|
# Run without syncing first (use current environment state)
|
|
uv run --frozen script.py
|
|
|
|
# Run with additional temporary dependencies
|
|
uv run --with httpx --with rich script.py
|
|
|
|
# Run without project dependencies (standalone)
|
|
uv run --no-project example.py
|
|
|
|
# Run with environment variables from file
|
|
uv run --env-file .env script.py
|
|
```
|
|
|
|
### 4. PEP 723 Inline Script Metadata
|
|
|
|
**Create portable single-file scripts with dependencies:**
|
|
|
|
```bash
|
|
# Initialize script with metadata block
|
|
uv init --script example.py --python 3.12
|
|
|
|
# Add dependencies to existing script
|
|
uv add --script example.py requests rich
|
|
```
|
|
|
|
**Example script structure:**
|
|
|
|
```python
|
|
#!/usr/bin/env -S uv --quiet run --active --script
|
|
# /// script
|
|
# requires-python = ">=3.11"
|
|
# dependencies = [
|
|
# "requests>=2.31",
|
|
# "rich>=13.0",
|
|
# ]
|
|
# ///
|
|
|
|
import requests
|
|
from rich import print
|
|
|
|
response = requests.get("https://api.github.com/repos/astral-sh/uv")
|
|
print(f"Stars: {response.json()['stargazers_count']}")
|
|
```
|
|
|
|
**Run scripts:**
|
|
|
|
```bash
|
|
# Auto-creates isolated environment and runs
|
|
uv run example.py
|
|
|
|
# Run with additional dependencies
|
|
uv run --with beautifulsoup4 example.py
|
|
|
|
# Lock script for reproducibility
|
|
uv lock --script example.py # Creates example.py.lock
|
|
|
|
# Make executable and run directly
|
|
chmod +x example.py
|
|
./example.py
|
|
```
|
|
|
|
**Best practices for scripts:**
|
|
|
|
- Always include `requires-python` for compatibility
|
|
- Use version constraints for critical dependencies
|
|
- Lock scripts before sharing for reproducibility
|
|
- Add `exclude-newer` in `[tool.uv]` for time-based pinning
|
|
|
|
### 5. Tool Management
|
|
|
|
**One-off tool execution (ephemeral environments):**
|
|
|
|
```bash
|
|
# Run tool without installing (uvx is alias)
|
|
uvx ruff check
|
|
uvx pycowsay "hello from uv"
|
|
|
|
# Run specific version
|
|
uvx ruff@0.3.0 check
|
|
uvx --from 'ruff>=0.3.0,<0.4.0' ruff check
|
|
|
|
# Run tool from different package
|
|
uvx --from httpie http GET example.com
|
|
|
|
# Run with plugin/additional dependencies
|
|
uvx --with mkdocs-material mkdocs serve
|
|
```
|
|
|
|
**Persistent tool installation:**
|
|
|
|
```bash
|
|
# Install tool globally (adds to PATH)
|
|
uv tool install ruff black mypy
|
|
|
|
# Install with version constraint
|
|
uv tool install 'httpie>0.1.0'
|
|
|
|
# Install from git
|
|
uv tool install git+https://github.com/httpie/cli
|
|
|
|
# Install with additional packages
|
|
uv tool install mkdocs --with mkdocs-material
|
|
|
|
# Upgrade tools
|
|
uv tool upgrade ruff
|
|
uv tool upgrade --all
|
|
|
|
# List installed tools
|
|
uv tool list
|
|
uv tool list --show-paths
|
|
|
|
# Uninstall tool
|
|
uv tool uninstall ruff
|
|
|
|
# Update shell configuration for tools
|
|
uv tool update-shell
|
|
```
|
|
|
|
### 6. Python Version Management
|
|
|
|
**Install and manage Python versions:**
|
|
|
|
```bash
|
|
# Install specific Python version (auto-downloads if needed)
|
|
uv python install 3.12
|
|
uv python install 3.11 3.12 3.13 # Multiple at once
|
|
|
|
# List available versions
|
|
uv python list
|
|
uv python list --all-versions
|
|
|
|
# Pin Python version for project
|
|
uv python pin 3.12 # Creates .python-version
|
|
|
|
# Find Python executable
|
|
uv python find 3.11
|
|
|
|
# Upgrade Python installations
|
|
uv python upgrade 3.11
|
|
uv python upgrade --all
|
|
|
|
# Use specific Python for command
|
|
uv run --python 3.11 script.py
|
|
uv venv --python 3.12.0
|
|
```
|
|
|
|
**Python is automatically downloaded when needed:**
|
|
|
|
- Supports CPython, PyPy, GraalPy, and other implementations
|
|
- Managed installations stored in `~/.local/share/uv/python/` (Unix)
|
|
- Preference configurable: `only-managed`, `managed`, `system`, `only-system`
|
|
|
|
### 7. Virtual Environment Management
|
|
|
|
**Create virtual environments:**
|
|
|
|
```bash
|
|
# Create in .venv directory (default)
|
|
uv venv
|
|
|
|
# Create with specific Python version
|
|
uv venv --python 3.11
|
|
uv venv --python pypy3.9
|
|
|
|
# Create with custom path
|
|
uv venv myenv
|
|
|
|
# Create with system packages access
|
|
uv venv --system-site-packages
|
|
|
|
# Create with seed packages (pip, setuptools, wheel)
|
|
uv venv --seed
|
|
|
|
# Activate (standard Python activation)
|
|
source .venv/bin/activate # Unix
|
|
.venv\Scripts\activate # Windows
|
|
```
|
|
|
|
**Warning**: Running `uv venv` again **wipes existing environment** without confirmation.
|
|
|
|
### 8. pip-Compatible Interface
|
|
|
|
**Direct pip replacement commands:**
|
|
|
|
```bash
|
|
# Install packages
|
|
uv pip install flask requests
|
|
uv pip install -r requirements.txt
|
|
uv pip install -e . # Editable install
|
|
|
|
# Install from git
|
|
uv pip install git+https://github.com/psf/requests
|
|
uv pip install git+https://github.com/pallets/flask@main
|
|
|
|
# Compile requirements (like pip-compile)
|
|
uv pip compile pyproject.toml -o requirements.txt
|
|
uv pip compile requirements.in -o requirements.txt
|
|
uv pip compile --upgrade-package ruff requirements.in
|
|
|
|
# Sync environment to exact requirements (like pip-sync)
|
|
uv pip sync requirements.txt
|
|
|
|
# Uninstall packages
|
|
uv pip uninstall flask requests
|
|
uv pip uninstall -r requirements.txt
|
|
|
|
# List installed packages
|
|
uv pip list
|
|
uv pip list --format json
|
|
uv pip freeze > requirements.txt
|
|
|
|
# Show package info
|
|
uv pip show requests
|
|
|
|
# Check for conflicts
|
|
uv pip check
|
|
|
|
# Display dependency tree
|
|
uv pip tree
|
|
uv pip tree --depth 2
|
|
```
|
|
|
|
### 9. Workspace Management (Monorepos)
|
|
|
|
**Configure workspaces in root pyproject.toml:**
|
|
|
|
```toml
|
|
[tool.uv.workspace]
|
|
members = ["packages/*", "apps/*"]
|
|
exclude = ["packages/deprecated"]
|
|
```
|
|
|
|
**Workspace dependency references:**
|
|
|
|
```toml
|
|
[project]
|
|
name = "myapp"
|
|
dependencies = ["shared-lib", "core-utils"]
|
|
|
|
[tool.uv.sources]
|
|
shared-lib = { workspace = true }
|
|
core-utils = { workspace = true }
|
|
```
|
|
|
|
**Workspace commands:**
|
|
|
|
```bash
|
|
# Build specific workspace package
|
|
uv build --package my-package
|
|
|
|
# Run in workspace package context
|
|
uv run --package my-package python script.py
|
|
|
|
# Lock workspace (single lockfile for all members)
|
|
uv lock
|
|
```
|
|
|
|
### 10. Package Building and Publishing
|
|
|
|
**Build distributions:**
|
|
|
|
```bash
|
|
# Build wheel and source distribution
|
|
uv build
|
|
|
|
# Build only wheel
|
|
uv build --wheel
|
|
|
|
# Build specific workspace package
|
|
uv build --package my-package
|
|
|
|
# Output to custom directory
|
|
uv build --out-dir dist/
|
|
```
|
|
|
|
**Publish to PyPI:**
|
|
|
|
```bash
|
|
# Install twine separately for now
|
|
uv pip install twine
|
|
|
|
# Upload to PyPI
|
|
twine upload dist/*
|
|
|
|
# With authentication
|
|
twine upload dist/* --username __token__ --password $PYPI_TOKEN
|
|
```
|
|
|
|
## Configuration
|
|
|
|
### pyproject.toml Structure
|
|
|
|
**Standard project configuration:**
|
|
|
|
```toml
|
|
[project]
|
|
name = "myproject"
|
|
version = "1.0.0"
|
|
description = "My awesome project"
|
|
requires-python = ">=3.11"
|
|
dependencies = [
|
|
"fastapi>=0.115.2",
|
|
"pydantic>=2.5.3",
|
|
]
|
|
|
|
# Development dependencies using PEP 735 dependency groups
|
|
[dependency-groups]
|
|
dev = [
|
|
"pytest>=8.4.2",
|
|
"pytest-cov>=6.0.0",
|
|
"pytest-mock>=3.15.1",
|
|
"ruff>=0.13.3",
|
|
"pyright>=1.1.406",
|
|
"mypy>=1.18.2",
|
|
"pre-commit>=4.3.0",
|
|
]
|
|
docs = ["sphinx>=7.0", "sphinx-rtd-theme>=1.3.0"]
|
|
test = ["pytest-cov>=6.0.0", "pytest-asyncio>=0.21.0"]
|
|
|
|
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[tool.uv]
|
|
# Core settings
|
|
managed = true
|
|
package = true
|
|
default-groups = ["dev"]
|
|
|
|
# Resolution
|
|
resolution = "highest" # or "lowest", "lowest-direct"
|
|
index-strategy = "first-index"
|
|
|
|
# Build configuration
|
|
compile-bytecode = true
|
|
no-build-isolation-package = ["flash-attn"]
|
|
|
|
# Python management
|
|
python-preference = "managed"
|
|
python-downloads = "automatic"
|
|
|
|
# Custom package sources
|
|
[tool.uv.sources]
|
|
torch = { index = "pytorch-cu121" }
|
|
internal-lib = { workspace = true }
|
|
|
|
# Custom indexes
|
|
[[tool.uv.index]]
|
|
name = "pytorch-cu121"
|
|
url = "https://download.pytorch.org/whl/cu121"
|
|
explicit = true
|
|
```
|
|
|
|
### Environment Variables
|
|
|
|
**Key environment variables:**
|
|
|
|
```bash
|
|
# Cache and directories
|
|
export UV_CACHE_DIR="/custom/cache"
|
|
export UV_PROJECT_ENVIRONMENT=".venv"
|
|
|
|
# Python management
|
|
export UV_PYTHON_PREFERENCE="managed"
|
|
export UV_PYTHON_DOWNLOADS="automatic"
|
|
|
|
# Network configuration
|
|
export UV_CONCURRENT_DOWNLOADS=20
|
|
export UV_CONCURRENT_BUILDS=8
|
|
|
|
# Index authentication
|
|
export UV_INDEX_PRIVATE_USERNAME="user"
|
|
export UV_INDEX_PRIVATE_PASSWORD="pass"
|
|
|
|
# Preview features
|
|
export UV_PREVIEW=1
|
|
|
|
# Disable cache
|
|
export UV_NO_CACHE=1
|
|
|
|
# System Python
|
|
export UV_SYSTEM_PYTHON=1
|
|
```
|
|
|
|
For complete configuration reference, see `references/configuration.md`.
|
|
|
|
## Common Workflows
|
|
|
|
### Starting a New Project
|
|
|
|
```bash
|
|
# 1. Initialize project
|
|
uv init myproject
|
|
cd myproject
|
|
|
|
# 2. Add dependencies
|
|
uv add fastapi uvicorn sqlalchemy
|
|
|
|
# 3. Add dev dependencies
|
|
uv add --dev pytest ruff mypy
|
|
|
|
# 4. Run application
|
|
uv run python main.py
|
|
|
|
# 5. Run tests
|
|
uv run pytest
|
|
```
|
|
|
|
### Creating a Portable Script
|
|
|
|
```bash
|
|
# 1. Create script with metadata
|
|
uv init --script analyze.py --python 3.11
|
|
|
|
# 2. Add dependencies
|
|
uv add --script analyze.py pandas matplotlib
|
|
|
|
# 3. Edit script content
|
|
# (add your code to analyze.py)
|
|
|
|
# 4. Lock for reproducibility
|
|
uv lock --script analyze.py
|
|
|
|
# 5. Make executable
|
|
chmod +x analyze.py
|
|
|
|
# 6. Run
|
|
./analyze.py
|
|
```
|
|
|
|
### Migrating from pip/requirements.txt
|
|
|
|
```bash
|
|
# 1. Initialize project
|
|
uv init --bare
|
|
|
|
# 2. Import dependencies
|
|
uv add -r requirements.txt
|
|
uv add --dev -r requirements-dev.txt
|
|
|
|
# 3. Remove old files
|
|
rm requirements.txt requirements-dev.txt
|
|
|
|
# 4. Use uv commands going forward
|
|
uv sync # Install dependencies
|
|
uv add new-package # Add new dependency
|
|
```
|
|
|
|
### Migrating from Poetry
|
|
|
|
```bash
|
|
# Option 1: Automated migration
|
|
uvx migrate-to-uv
|
|
uvx migrate-to-uv --dry-run # Preview first
|
|
|
|
# Option 2: Manual conversion
|
|
# - Convert [tool.poetry] to [project]
|
|
# - Convert poetry.lock to uv.lock: uv lock
|
|
# - Use uv commands instead of poetry commands
|
|
```
|
|
|
|
### CI/CD Integration (GitHub Actions)
|
|
|
|
```yaml
|
|
name: CI
|
|
on: [push, pull_request]
|
|
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Install uv
|
|
uses: astral-sh/setup-uv@v6
|
|
with:
|
|
enable-cache: true
|
|
|
|
- name: Set up Python
|
|
run: uv python install 3.11
|
|
|
|
- name: Install dependencies
|
|
run: uv sync --frozen --all-extras
|
|
|
|
- name: Run tests
|
|
run: uv run pytest
|
|
|
|
- name: Run linters
|
|
run: |
|
|
uv run ruff check .
|
|
uv run mypy .
|
|
```
|
|
|
|
### Docker Integration
|
|
|
|
```dockerfile
|
|
FROM python:3.12-slim
|
|
|
|
# Install uv
|
|
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy dependency files
|
|
COPY pyproject.toml uv.lock ./
|
|
|
|
# Install dependencies
|
|
RUN uv sync --frozen --no-dev
|
|
|
|
# Copy application
|
|
COPY . .
|
|
|
|
# Use virtual environment
|
|
ENV PATH="/app/.venv/bin:$PATH"
|
|
|
|
CMD ["python", "main.py"]
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### "Externally Managed" Error
|
|
|
|
**Problem**: `error: The interpreter is externally managed`
|
|
|
|
**Solution**: Use virtual environments instead of `--system`:
|
|
|
|
```bash
|
|
uv venv
|
|
source .venv/bin/activate
|
|
uv pip install package
|
|
```
|
|
|
|
### Build Failures
|
|
|
|
**Problem**: Package fails to build from source
|
|
|
|
**Common causes**:
|
|
|
|
- Missing system dependencies (compilers, headers)
|
|
- Python version incompatibility
|
|
- Outdated package version
|
|
|
|
**Solutions**:
|
|
|
|
- Install system dependencies: `apt-get install python3-dev build-essential`
|
|
- Add version constraints: `uv add "numpy>=1.20"`
|
|
- Check error message for missing modules
|
|
|
|
### Lockfile Out of Sync
|
|
|
|
**Problem**: Dependencies changed but lockfile not updated
|
|
|
|
**Solutions**:
|
|
|
|
```bash
|
|
uv lock # Regenerate lockfile
|
|
uv sync --locked # Error if out of sync (CI mode)
|
|
uv sync --frozen # Don't update lockfile
|
|
```
|
|
|
|
### Cache Issues
|
|
|
|
**Problem**: Stale cache causing problems
|
|
|
|
**Solutions**:
|
|
|
|
```bash
|
|
uv cache clean # Clean entire cache
|
|
uv cache prune # Remove unreachable entries
|
|
uv --no-cache <command> # Bypass cache temporarily
|
|
```
|
|
|
|
For more troubleshooting scenarios, see `references/troubleshooting.md`.
|
|
|
|
## Resources
|
|
|
|
This skill includes comprehensive reference documentation:
|
|
|
|
### references/
|
|
|
|
- `cli_reference.md` - Complete CLI commands and arguments reference
|
|
- `configuration.md` - All configuration options and environment variables
|
|
- `workflows.md` - Detailed workflow guides and examples
|
|
- `troubleshooting.md` - Common issues and solutions
|
|
|
|
### assets/
|
|
|
|
- `pyproject_templates/` - Example pyproject.toml configurations
|
|
- `script_examples/` - PEP 723 script templates
|
|
- `docker_examples/` - Docker configuration templates
|
|
- `github_actions/` - CI/CD workflow examples
|
|
|
|
## Key Principles
|
|
|
|
1. **Speed**: uv is 10-100x faster than traditional tools
|
|
2. **Reproducibility**: Lockfiles ensure consistent environments
|
|
3. **Simplicity**: Single tool replaces multiple Python tools
|
|
4. **Modern Standards**: PEP 723 scripts, standard pyproject.toml
|
|
5. **Developer Experience**: Automatic Python installation, smart defaults
|
|
|
|
## Version Information
|
|
|
|
Current latest version: **0.9.5** (October 2025)
|
|
|
|
Key recent features:
|
|
|
|
- Python 3.14 support with free-threaded builds
|
|
- Enhanced authentication system
|
|
- Advanced build configuration
|
|
- Workspace improvements
|
|
- Docker image optimizations
|
|
|
|
## External Resources
|
|
|
|
- Official docs: <https://docs.astral.sh/uv/>
|
|
- GitHub: <https://github.com/astral-sh/uv>
|
|
- Concepts guide: <https://docs.astral.sh/uv/concepts/>
|
|
- Migration guides: <https://docs.astral.sh/uv/guides/migration/>
|