极快的python项目管理工具:uv使用指南

💡 原文中文,约8900字,阅读约需22分钟。
📝

内容提要

uv 是 Astral 团队用 Rust 编写的极速 Python 项目管理工具,可替代 pip、virtualenv 等。它通过全局缓存和优化算法实现快速依赖解析与安装,核心命令包括 uv init 创建项目、uv add/remove 管理依赖、uv sync 恢复环境,并支持依赖组、在线安装 Python、uv tool 管理全局工具及脚本依赖管理。其优势是快速和可重复,推荐 Python 开发者使用。

🔎

延伸解读

uv 与 Poetry 的定位差异

文章开头提到上一篇文章介绍了 Poetry,而 uv 是另一款工具。uv 由 Astral 团队用 Rust 编写,目标是替代 pip、pip-tools 和 virtualenv,强调极快的依赖解析和安装速度。与 Poetry 相比,uv 同样使用 pyproject.toml 和锁文件,但 uv 还支持在线安装 Python、管理全局工具和脚本依赖,功能范围更广。不过文章也指出 uv 仍在快速迭代中,部分用法处于预览阶段,选择时需考虑项目对稳定性的要求。

锁文件与可重复环境的关键

uv.lock 记录当前解析出的依赖集合,是项目依赖的快照。文章强调不应手动编辑 uv.lock,但可以手动编辑 pyproject.toml。提交到 Git 时只需提交 pyproject.toml 和 uv.lock,不应提交 .venv 目录。使用 uv sync 能基于锁文件快速恢复环境,精确到每个依赖的具体版本,这对应用类型的 Python 项目尤其有用。如果锁文件丢失,可用 uv lock 重新生成。

依赖组与可选依赖的分工

uv 支持依赖组(dependency-groups)和可选依赖(optional dependencies)两种机制。依赖组用于管理开发与测试等阶段的依赖,例如用 uv add ruff --group dev 添加开发依赖;可选依赖则定义在 [project.optional-dependencies] 中,通过 --extra 指定。文章指出两者用法相近但职责不同,uv 各子命令对它们的操作支持相对一致,可按项目需求选择。uv sync 提供 --no-dev、--only-dev、--group 等选项决定

缓存与离线模式的实际影响

uv 的速度提升重要原因之一是从全局缓存获取依赖。UV_LINK_MODE 环境变量或 --link-mode 参数可控制从缓存安装的方式,可选 clone、copy、hardlink、symlink。uv cache dir 查看缓存位置,uv cache size 查看大小,uv cache clean 清理全部缓存,uv cache prune 则只清理不再使用的缓存包。此外,--offline 模式可禁用网络,仅使用本地缓存安装依赖,若依赖缺失则直接报错,适合网络受限场景。

❓

Q&A

uv 是什么?它和 pip、virtualenv 有什么区别?

uv 是由 Astral 团队用 Rust 编写的下一代 Python 项目与包管理工具,目标是替代 pip、pip-tools 和 virtualenv,为 Python 生态带来更快的依赖解析和安装体验。它通过全局缓存与依赖解析算法优化实现高速运行。

如何用 uv 创建一个新的 Python 项目?

使用 uv init 命令并传递项目名即可创建新项目,例如 uv init newproj。该命令会生成 pyproject.toml、.python-version、README.md、main.py 等文件,并初始化 Git 仓库。

uv 如何管理项目依赖?添加和删除依赖的命令是什么?

使用 uv add 添加依赖,例如 uv add aiohttp httpx,依赖会记录在 pyproject.toml 中;使用 uv remove 卸载依赖,例如 uv remove aiohttp。添加或删除时 uv 会自动更新 pyproject.toml 和 uv.lock。

uv sync 有什么作用?为什么需要 uv.lock 文件?

uv sync 用于根据 uv.lock 快速恢复项目依赖环境,精确到每个依赖的具体版本。uv.lock 是项目依赖的快照,记录当前解析出的依赖集合,确保环境可重复。不应手动编辑 uv.lock,若丢失可用 uv lock 重新生成。

uv 如何管理开发依赖和测试依赖?

uv 支持依赖组(dependency-groups),可用 uv add ruff --group dev 添加开发依赖,uv add pytest --group test 添加测试依赖。uv sync 时可通过 --no-dev、--only-dev、--group 等选项控制安装哪些组。

uv 能在线安装 Python 版本吗?如何指定项目使用的 Python 版本?

可以。uv 支持从 GitHub 在线下载并安装指定版本的 Python,例如 uv python install 3.14。使用 uv python pin 3.14 可将项目 Python 版本固定为 3.14,并更新 .python-version 文件。

uv tool 是什么?它和 uvx 有什么区别?

uv tool 是 uv 提供的全局工具管理功能,类似 pipx。uv tool install 将工具安装为全局可用命令;uv tool run(即 uvx)则无需安装,在临时环境中即时运行工具,环境会被缓存以便复用。经常使用的命令建议用 uv tool install。

uv 如何管理单个 Python 脚本的依赖?

使用 uv init --script test.py 初始化脚本,会在文件开头添加依赖管理注释。可用 uv add requests --script test.py 添加依赖,uv run test.py 运行脚本。还可添加 shebang #!/usr/bin/env -S uv run 使脚本可直接执行。

🏷️

标签

➡️

继续阅读