Loading...
Loading...
Manages Python CLI tools with uv. Learn when to use uvx for temporary execution, uv tool install for persistent tools, and how to differentiate between tool dependencies and project dependencies. Includes version management, listing, cleanup, and scenarios for running tools with specific Python versions.
npx skill4agent add dawiddutoit/custom-claude uv-tool-management# Run ruff (Python linter) once without installation
uvx ruff check .
# Equivalent longer form
uv tool run ruff check .
# Install a tool permanently for repeated use
uv tool install ruff
# Then run the installed tool
ruff check .pipxuvx# Try a new tool without committing to it
uvx httpie https://api.github.com/users/github
# Run a tool on-demand in CI
uvx mypy src/
# Run tool from different package
uvx --from httpie http https://example.comuv tool install# Install tools you use daily
uv tool install ruff
uv tool install black
uv tool install mypy
# Then run directly without prefix
ruff check .
black --check src/
mypy src/uv run# Test runner needs access to project (test libraries, modules)
uv run pytest tests/
# Linter running on project code
uv run mypy src/
# Format project code
uv run black src/uvx ruff check .
uvx black --check src/# Run specific version of a tool
uvx ruff@0.3.0 check .
# Use version constraint
uvx --from 'ruff>=0.3.0,<0.4.0' ruff check .# httpie is in package 'httpie', command is 'http'
uvx --from httpie http https://api.github.com
# mkdocs is in 'mkdocs', command is 'mkdocs'
uvx mkdocs serve# mypy with optional faster caching
uvx --from 'mypy[faster-cache]' mypy src/
# mkdocs with material theme
uvx --with mkdocs-material mkdocs serve# Run tool with Python 3.10 (useful for compatibility testing)
uvx --python 3.10 ruff check .
# Ensure tool runs on minimum supported version
uvx --python 3.9 pytest tests/# Install directly from GitHub
uvx --from git+https://github.com/httpie/cli httpie# Install latest version
uv tool install ruff
# Install specific version
uv tool install ruff@0.3.0
# Install with extras
uv tool install 'mypy[faster-cache]'
# Install from git
uv tool install git+https://github.com/user/tooluv tool list
# Example output:
# black 0.23.11 /Users/user/.local/bin/black
# mypy 1.7.0 /Users/user/.local/bin/mypy
# ruff 0.3.0 /Users/user/.local/bin/ruff# Upgrade specific tool to latest
uv tool upgrade ruff
# Upgrade all tools
uv tool upgrade --all
# Upgrade to specific version
uv tool upgrade ruff@0.4.0# Remove installed tool
uv tool uninstall ruff
# Remove multiple tools
uv tool uninstall ruff black mypy# pyproject.toml
[project]
# Main project dependencies - needed to run your application
dependencies = [
"fastapi>=0.104.0",
"httpx>=0.27.0",
]
[project.optional-dependencies]
# Optional features for your application (not development tools)
aws = ["boto3>=1.34.0"]
database = ["sqlalchemy>=2.0.0"]
[dependency-groups]
# Development tools - only needed while developing
test = [
"pytest>=8.0.0",
"pytest-cov>=4.1.0",
]
lint = [
"ruff>=0.1.0",
"mypy>=1.7.0",
]
format = [
"black>=23.11.0",
]| Use Case | Tool | Command | Where |
|---|---|---|---|
| Try a new linter | uvx | | Any directory |
| Lint project code regularly | uv run | | Project directory |
| Lint tool used across projects | uv tool install | | Any directory |
| Test code | uv run | | Project directory |
| Build documentation | uv tool install | | Global install |
| One-time script execution | uvx | | Any directory |
| Format code | uv run | | Project directory |
# Show version of installed tool
ruff --version
# Or via uv
uv tool list | grep ruff# Upgrade to latest
uv tool upgrade ruff
# Keep all tools up to date
uv tool upgrade --all# Use specific version (best practice for team consistency)
uv tool install ruff@0.3.0
# Override installed version
uv tool install ruff@0.4.0# Uninstall unused tools
uv tool uninstall old-tool
# Check what's installed
uv tool list
# Free up disk space
uv cache prune# These tools both depend on different versions of a library
# uvx creates isolated environments, avoiding conflicts
uvx tool-a
uvx tool-b
# Both run in separate, isolated environments
# No dependency conflicts# Add extra packages to tool execution
uvx --with mkdocs-material mkdocs serve
# Tool runs with mkdocs + mkdocs-material installed# Some tools require specific Python versions
# Ensure compatibility
uvx --python 3.9 older-tool
# Run with minimum supported Python
uvx --python 3.10 modern-tool# Run ruff once to check your code
uvx ruff check .
# Output analysis but don't install anything
# After execution, no system changes
# Next time you run it, it's fetched again (but cached locally)# In your project directory
cd my-project
# Edit pyproject.toml to add ruff to dev dependencies
# [dependency-groups]
# lint = ["ruff>=0.1.0"]
# Sync environment
uv sync --group lint
# Run linter from project environment
uv run ruff check .
# Everyone on team uses same ruff version (from uv.lock)# Install once globally
uv tool install ruff
# Use in any directory
cd project-a && ruff check .
cd ../project-b && ruff check .
# No project setup needed
# Tool always available in PATH# Run with Python 3.10
uvx --python 3.10 pytest tests/
# Run with Python 3.12
uvx --python 3.12 pytest tests/
# Each uses different Python version
# No installation overhead# Via uvx (temporary)
uvx --from 'mypy[faster-cache]' mypy src/
# Via uv tool install (persistent)
uv tool install 'mypy[faster-cache]'
mypy src/# .github/workflows/ci.yml
- name: Lint code
run: uvx ruff check .
- name: Type check
run: uvx mypy src/
- name: Format check
run: uvx black --check .
- name: Test
run: |
uv sync --group test
uv run pytest tests/# See what's installed
uv tool list
# Remove tool you no longer use
uv tool uninstall old-formatter
# Prune cache of unused packages
uv cache prune
# Check cache location and size
uv cache dircurl -LsSf https://astral.sh/uv/install.sh | sh