uv 高级包管理和构建工具
uv
是Astral公司开发的一款高性能开源Python工程依赖和管理工具,发布于2024年,当前版本是0.8.5。uv
为Python带来了现代化的工程和依赖管理功能,让Python开发也能具有类似Maven、NPM、Cargo等的工程化体验,取代因过于简陋而广受诟病的requirements.txt
管理模式。
此外如果了解过Poetry工具我们就会发现,uv
定位其实与Poetry相同,但uv
使用Rust语言编写,它虽然确实是“又重造了一个轮子”,但相比Poetry它提供了更人性化的使用体验、更高的性能和更快的运行速度,近年来获得了广泛关注。
官方文档:https://docs.astral.sh/uv/
Github:https://github.com/astral-sh/uv
安装uv
uv
提供了一键安装脚本,我们直接运行脚本安装即可。对于Linux操作系统,可执行以下命令安装。
curl -LsSf https://astral.sh/uv/install.sh | sh
对于Windows操作系统,执行以下PowerShell脚本安装。
irm https://astral.sh/uv/install.ps1 | iex
和Poetry类似,uv
的安装脚本也仅仅是下载可执行文件到本地,我们还需要根据安装脚本的提示手动配置环境变量。当安装完成并配置好环境变量后,我们可以使用以下命令输出uv
的版本信息,检查安装效果。
uv self version
uv基本使用
查看帮助信息
uv
相关的命令我们没必要背下来,使用时可以执行以下命令查看帮助信息。
uv help
初始化Python项目
初始化项目非常简单,我们在新建的文件夹中执行以下命令即可,uv
工具会自动帮我们创建一些必要的文件。
uv init
默认创建的文件目录结构如下。
|_ .git # uv默认初始化了Git,这个文件夹是Git工具使用的路径
|_ .gitignore # Git忽略文件
|_ .python-version # 记录当前项目使用的Python解释器版本号,用于初始化虚拟环境
|_ main.py # 项目入口示例文件
|_ pyproject.toml # 现代Python项目的描述文件
|_ README.md # 项目说明文件,默认的空的
此外,如果你希望创建工程时新建文件夹而不是使用当前文件夹,可以使用形如uv init demo
的命令。
创建虚拟环境
执行以下命令在当前项目目录中创建虚拟环境,提示信息中会包含对应操作系统下激活虚拟环境需要执行的命令。
uv venv
该命令会在当前项目目录中创建一个名为.venv
的文件夹作为Python虚拟环境路径。至于激活虚拟环境,uv
没有像Poetry那样提供命令封装,我们还是使用虚拟环境中的激活脚本即可。
配置PyPI镜像
在~/.config/uv/uv.toml
中可以添加全局镜像配置。
[[index]]
default = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple"
default = true
此外,在工程的pyproject.toml
中可以添加如下配置,为工程配置局部的PyPI镜像。
[[tool.uv.index]]
url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple"
default = true
管理依赖
同步依赖
当我们拿到一个基于uv
的工程时,可以直接执行uv sync
命令,它会根据项目的pyproject.toml
文件下载项目依赖。
uv sync
执行该命令后,我们还会观察到项目内自动生成了uv.lock
文件,该文件用于锁定依赖版本。
安装依赖
安装依赖使用uv add
命令。
uv add <包名>
依赖安装后会同步写入项目的pyproject.toml
文件,并更新uv.lock
。
和Poetry类似,uv
的依赖也支持分组,例如uv add --dev pytest
可以在dev
分组中安装pytest
框架。uv
中,分组依赖会在pyproject.toml
写入类似如下的信息。
[dependency-groups]
dev = [
"pytest>=8.4.1",
]
uv sync
命令会安装全部依赖,如果仅想安装某个特定的依赖分组,可以使用--group
参数,例如仅安装核心依赖和dev
分组,命令为uv sync --group dev
。此外,--only-group
可以指定仅安装某个分组,不包括核心依赖;--no-group
指定排除某个分组,安装其它依赖(包括核心依赖)。
删除依赖
删除依赖使用uv remove
命令。
uv remove <包名>
依赖删除后也会同步更新项目的pyproject.toml
文件,并更新uv.lock
。