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

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。