askill
uv-workspaces

uv-workspacesSafety 95Repository

Manage monorepo and multi-package Python projects with uv workspaces. Covers workspace configuration, virtual workspaces, member dependencies, shared lockfiles, source inheritance, and building. Use when user mentions uv workspaces, Python monorepo, multi-package projects, workspace members, or shared dependencies across packages.

16 stars
1.2k downloads
Updated 4 days ago

Package Files

Loading files...
SKILL.md

UV Workspaces

Quick reference for managing monorepo and multi-package projects with UV workspaces.

When to Use This Skill

Use this skill when...Use another skill instead when...
Setting up a Python monorepo with shared depsManaging a single package (uv-project-management)
Configuring workspace members and inter-package depsAdding git/URL dependencies (uv-advanced-dependencies)
Using --package or --all-packages flagsBuilding/publishing to PyPI (python-packaging)
Creating virtual workspaces (root with no project)Managing Python versions (uv-python-versions)
Debugging workspace dependency resolutionRunning standalone scripts (uv-run)

Quick Reference

Workspace Structure

my-workspace/
├── pyproject.toml          # Root workspace config
├── uv.lock                 # Shared lockfile (all members)
├── packages/
│   ├── core/
│   │   ├── pyproject.toml
│   │   └── src/core/
│   ├── api/
│   │   ├── pyproject.toml
│   │   └── src/api/
│   └── cli/
│       ├── pyproject.toml
│       └── src/cli/
└── README.md

Root pyproject.toml

[project]
name = "my-workspace"
version = "0.1.0"
requires-python = ">=3.11"

[tool.uv.workspace]
members = ["packages/*"]

# Optional: exclude specific members
exclude = ["packages/experimental"]

Virtual Workspace (No Root Package)

When the root is purely organizational and not a package itself, omit the [project] table:

# Root pyproject.toml — virtual workspace (no [project] table)
[tool.uv.workspace]
members = ["packages/*"]
  • The root is not a workspace member
  • All members live in subdirectories
  • uv run and uv sync require --package or --all-packages (will error without them)

Member pyproject.toml

[project]
name = "my-api"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = [
    "my-core",       # Workspace member
    "fastapi",       # External (PyPI)
]

[tool.uv.sources]
my-core = { workspace = true }

Common Commands

OperationCommand
Sync workspace rootuv sync
Sync all membersuv sync --all-packages
Sync specific memberuv sync --package my-api
Run in member contextuv run --package my-api python script.py
Lock entire workspaceuv lock
Upgrade a dependencyuv lock --upgrade-package requests
Build specific packageuv build --package my-core
Add dep to membercd packages/api && uv add requests
Add workspace depcd packages/api && uv add ../core

Key Behaviors

Source Inheritance

Root tool.uv.sources apply to all members unless overridden.

Use case: Define workspace sources in root for all members, override only when a specific member needs a different version:

# Root pyproject.toml — applies to all members
[tool.uv.sources]
my-utils = { workspace = true }

# packages/legacy/pyproject.toml — needs pinned version
[tool.uv.sources]
my-utils = { path = "../utils-v1" }  # Overrides root entirely

Override is per-dependency and total — if a member defines a source for a dependency, the root source for that dependency is ignored completely.

requires-python Resolution

The workspace enforces the intersection of all members' requires-python:

# packages/core: requires-python = ">=3.10"
# packages/api:  requires-python = ">=3.11"
# Effective:     requires-python = ">=3.11"

All members must have compatible Python version requirements.

Editable Installations

Workspace member dependencies are always editable — source changes are immediately available without reinstallation.

Default Scope

CommandDefault scopeOverride
uv lockEntire workspace
uv syncWorkspace root only--package, --all-packages
uv runWorkspace root only--package, --all-packages
uv buildAll members--package

Workspace vs Path Dependencies

Feature{ workspace = true }{ path = "../pkg" }
Shared lockfileYesNo
Always editableYesOptional
Must be workspace memberYesNo
--package flag worksYesNo
Conflicting deps allowedNoYes

Use path dependencies when members need conflicting requirements or separate virtual environments.

Docker Layer Caching

# Install deps first (cached layer)
COPY pyproject.toml uv.lock packages/*/pyproject.toml ./
RUN uv sync --frozen --no-install-workspace

# Then install project (changes frequently)
COPY . .
RUN uv sync --frozen
FlagEffect
--no-install-projectSkip current project, install deps only
--no-install-workspaceSkip all workspace members, install deps only
--no-install-package <name>Skip specific package(s)
--frozenSkip lockfile freshness check

Agentic Optimizations

ContextCommand
Sync all membersuv sync --all-packages
CI sync (frozen)uv sync --all-packages --frozen
Test specific memberuv run --package my-core pytest --dots --bail=1
Test all membersuv run --all-packages pytest --dots --bail=1
Lock with upgradeuv lock --upgrade-package <dep>
Build one packageuv build --package my-core
Docker deps layeruv sync --frozen --no-install-workspace

See Also

  • uv-project-management — Managing individual packages
  • uv-advanced-dependencies — Path and Git dependencies
  • python-packaging — Building and publishing workspace packages

For detailed workspace patterns (virtual workspaces, Docker integration, source inheritance, syncing strategies), CI/CD examples, and troubleshooting, see REFERENCE.md.

Install

Download ZIP
Requires askill CLI v1.0+

AI Quality Score

92/100Analyzed 2 days ago

Comprehensive and highly actionable skill for managing uv workspaces in Python monorepos. Excellent structure with clear sections, practical command tables, code examples, and a useful "When to Use This Skill" comparison table. Well-organized with proper metadata, tags, and references to related skills. Suitable for general use beyond the repo.

95
92
90
90
92

Metadata

Licenseunknown
Version-
Updated4 days ago
Publisherlaurigates

Tags

apici-cdtesting