Python 开发中,管理依赖和虚拟环境常常让人头疼。传统的工具链如 pip、virtualenv 等,虽然能解决问题,但碎片化的体验、缓慢的速度和不一致性,一直困扰着开发者。
现在,一款名为 uv 的新工具横空出世,它用 Rust 编写,凭借惊人的速度和一体化的特性,正准备彻底改变这一切。uv 不仅仅是一个包管理器,它旨在替代现有的多种工具,为你带来前所未有的流畅开发体验。
uv
的核心功能uv
的强大之处在于其整合并优化了多项核心功能:
uv
使用 Rust 语言实现,并采用了被称为 pubgrub
的先进依赖解析算法。uv
能够轻松创建、激活和管理虚拟环境,替代了 virtualenv
或 venv
的功能。uv python
命令),这意味着你可以使用 uv
来安装和切换不同版本的 Python 解释器,无需借助 pyenv
等额外工具。uv.lock
):
uv
能够生成一个名为 uv.lock
的文件,精确记录项目所需所有依赖(包括直接和间接依赖)的精确版本号和它们的哈希值。uv.lock
文件,就能重现完全相同的依赖环境。这个文件与传统的 requirements.txt
文件不同,提供了更强的校验和可重复性保证。uvx
):
uvx
(或 uv tool run
)允许你在不将某个 Python 工具永久安装到你的项目虚拟环境或全局系统环境的情况下,临时地下载、运行并使用它。uvx
会快速创建一个临时的、隔离的虚拟环境,在其中安装并运行指定工具,任务完成后通常会清理或保持这个临时环境。black
或 ruff
)、避免项目依赖污染,以及快速尝试新工具都极为方便。uv
助你高效开发:核心工作流了解了 uv
的强大功能,让我们看看它在日常开发中如何简化你的工作流:
mkdir my_new_project
cd my_new_project
uv init # 创建 pyproject.toml (如果尚未存在)
uv venv # 创建 .venv 虚拟环境
source .venv/bin/activate # 激活虚拟环境 (macOS/Linux)
# .venv\Scripts\activate.bat 或 .venv\Scripts\Activate.ps1 (Windows)
激活环境后,可以轻松添加或移除依赖,uv
会自动更新 pyproject.toml
并同步虚拟环境。
uv add requests # 添加运行时依赖
uv add pytest --dev # 添加开发依赖
uv remove requests # 移除依赖
更改 pyproject.toml
后,运行 uv lock
来生成或更新 uv.lock
文件,并将其提交到版本控制。当团队成员拉取代码或在新的机器上设置项目时,只需运行 uv sync
,即可根据 uv.lock
精确安装所有依赖。
uv lock # 生成或更新 uv.lock 文件
uv sync # 根据 uv.lock 同步环境
使用 uv run
命令在激活的虚拟环境中执行项目脚本或命令。
uv run python my_script.py
# uv run start-server (如果你在 pyproject.toml 中定义了脚本别名)
例如,通过 uvx
临时运行代码格式化、静态分析等工具,无需在项目中安装它们。
uvx black . # 使用指定版本的 black 格式化代码
uvx ruff check . # 使用指定版本的 ruff 检查代码
pyproject.toml
是什么?
.venv
会不会占用太多空间?
uv
通过全局缓存机制解决此问题。首次下载的包会存储在全局缓存中,后续在不同项目中使用同一个包时,uv
会从缓存中硬链接或复制,而非重新下载,从而显著节省磁盘空间并加速安装。uv lock
有什么用?它和 requirements.txt
一样吗?
uv lock
用于生成精确锁定的 uv.lock
文件,确保环境可重复性。它与 requirements.txt
相似,但更强大:uv.lock
是工具自动生成的,包含所有直接和间接依赖的精确版本及哈希值,提供了更强的校验和可重复性保证。而 requirements.txt
通常是手动维护或由 pip freeze
生成,缺乏这种精确性。现代 Python 包管理工具普遍采用类似锁文件的机制。