Chapter 07

全局工具管理 uv tool

每个 CLI 工具独立环境、互不冲突——pipx 的一切它都能做,而且更快

问题:全局工具的冲突

你想全局装 black(格式化)、mypy(类型检查)、httpie(HTTP CLI)、poetry(别的项目还在用)。直接 pip install --user 很快就会遇到依赖冲突:black 要 click>=8,某老工具要 click<7——装一个坏一个。

正确做法:每个工具一个独立虚拟环境。历史上这是 pipx 的工作。uv 把这个能力内化为 uv tool,速度快 10 倍,配置更少。

uv tool install — 全局安装

# 装一个工具
uv tool install ruff
uv tool install black
uv tool install httpie
uv tool install poetry

# 带 extras 安装
uv tool install "mkdocs[python]"

# 指定 Python 版本
uv tool install --python 3.12 ansible

# 为工具注入额外依赖(很常见:某工具需要额外插件)
uv tool install mkdocs --with mkdocs-material --with mkdocs-minify-plugin
uv tool install poetry --with poetry-plugin-export

安装后:

# 首次使用需要把 ~/.local/bin 加进 PATH
uv tool update-shell   # 自动修改 shell 配置

uvx — 一次性运行工具

uvxuv tool run 的简写。它不永久安装工具,而是在临时环境中运行一次,类似 npx

# 一次性跑一个你没装过的工具
uvx ruff check .
uvx cowsay "hello uv"
uvx --from httpie http GET https://api.github.com/users/octocat

# 指定版本
uvx ruff@0.6.0 format .
uvx ruff@latest check .

# 带额外依赖
uvx --with pytest-cov pytest

# 指定 Python 版本跑工具
uvx --python 3.12 --from "django==4.2" django-admin startproject mysite
install vs uvx 选择

每天都用的工具(ruff、mypy、black、poetry)→ uv tool install 永久装。
偶尔用一次的工具(cookiecutter、pip-audit、某个数据转换小工具)→ uvx 一次性跑。
uvx 首次运行会下载,之后在缓存里命中(几毫秒),不会每次重建环境。

管理已安装的工具

# 列出所有
uv tool list
# - black v24.4.2
#   - black
#   - blackd
# - ruff v0.6.0
#   - ruff

# 升级
uv tool upgrade ruff
uv tool upgrade --all              # 升级所有工具

# 给工具加/减 extras 或 with 依赖
uv tool install --upgrade mkdocs --with mkdocs-awesome-pages-plugin

# 卸载
uv tool uninstall ruff
uv tool uninstall --all

# 查看工具环境详情
uv tool dir             # 工具环境的根目录
uv tool dir --bin       # 可执行文件的目录

常见工具安装清单(推荐)

# Linter / Formatter
uv tool install ruff             # 全家桶 linter + formatter
uv tool install mypy             # 类型检查
uv tool install pyright          # 微软的类型检查(可选)

# 包管理辅助
uv tool install pip-audit        # 依赖漏洞扫描
uv tool install pipdeptree       # 依赖树可视化(uv tree 替代)

# 实用 CLI
uv tool install httpie           # 命令行 HTTP 客户端
uv tool install yt-dlp           # 视频下载
uv tool install cookiecutter     # 模板生成

# Web 开发
uv tool install pre-commit       # Git hook 管理
uv tool install mkdocs --with mkdocs-material  # 文档

# AI / 数据
uv tool install "langchain-cli"
uv tool install marker-pdf       # PDF to markdown

uvx 运行 Git 仓库里的工具

不只是从 PyPI,uvx 也能直接运行 git 仓库:

# 运行别人仓库里的脚本
uvx --from git+https://github.com/user/cool-tool cool-tool

# 指定分支
uvx --from "git+https://github.com/user/cool-tool@dev" cool-tool

# 本地路径(测试自己开发中的工具)
uvx --from ./mytool mytool

工具隔离的好处

传统 pip install 全局

  • 所有工具共用一个 site-packages
  • 依赖冲突频繁
  • 升级一个可能连带破坏另一个
  • 卸载残留困难

uv tool 独立隔离

  • 每个工具独立 venv
  • 零依赖冲突
  • 升级单工具不影响其他
  • 卸载干净彻底

从 pipx 迁移

# 查看 pipx 已装的工具
pipx list --short

# 全部迁到 uv tool(简单复制命令即可)
for tool in $(pipx list --short | awk '{print $1}'); do
  uv tool install "$tool"
done

# 卸载 pipx(可选)
pip uninstall pipx

共享 Python 解释器节省磁盘

uv tool 的每个工具环境默认共享 uv 管理的 Python 解释器(通过硬链接),一台机器装 20 个工具不会多出 20 份 Python 二进制,总体磁盘占用很小。

# 查看所有工具环境的实际占用
du -sh ~/.local/share/uv/tools/*
本章小结

uv tool install 替代 pipx,每个 CLI 工具独立 venv、零冲突、秒级安装。uvx 替代 npx,一次性跑工具不留痕迹。日常三件套:ruff、mypy、pre-commit 先装上,剩下的随用随 uvx。下一章进入 Monorepo 多包工作区的进阶话题。