项目管理器工具uv使用


主要聊聊,进阶与企业最佳实践!

uv 是一个基于 Rust 实现的 Python 极速包管理器,用于替代 pipvirtualenv 的组合,主打 快、干净、易用。它是由 astral.sh 团队开发的,目标是让 Python 项目构建和依赖管理更现代化。

uv


1. 创造原因

主要介绍 uv 工具的主要优势!

uv 是由 Astral 公司开发的一个全新的 Python 包安装器和解析器,旨在成为 pippip-tools 的替代品。它用 Rust 编写,因此在性能上具有显著优势,尤其是在处理大型依赖图时。

> 1. 颠覆性优势

极速性能uv 能够以比 pip 快 10-100 倍的速度安装和解析依赖。确定性构建:默认情况下,uv 会生成确定性的锁定文件,确保在不同环境中安装相同的依赖版本,从而提高可重复性。

统一工作流uv 整合了 pip(安装)、pip-tools(编译依赖)和 venv(虚拟环境管理)的功能,提供了一个更统一、更简洁的命令行界面。兼容性uv 旨在与现有的 pip 生态系统兼容,支持 requirements.txt 文件和 pyproject.toml 中的 [project] 表。

> 2. 企业级特性

此外,UV 内置 跨平台锁文件(uv.lock)全局依赖缓存 机制,可共享缓存节省磁盘空间,并确保不同机器上安装结果一致。简而言之,UV 致力于为 Python 提供 更快、更可靠、更统一 的包管理体验,为项目开发带来新的选择。

# 企业级配置模板
# ~/.config/uv/config.toml
[install]
# 国内镜像加速
index-url = "https://pypi.tuna.tsinghua.edu.cn/simple"

[cache]
# 全局缓存路径
path = "/opt/uv-cache"

[venv]
# 统一虚拟环境目录
path = "venv"

2. 安装方式

Python 相关工具安装都比较简单!

安装 uv 非常简单,可以从 PyPI 安装,也可以使用 pipx(推荐使用)。

# macOS/Linux
$ curl -LsSf https://astral.sh/uv/install.sh | sh

# From PyPI
$ pip install uv  # pip
$ pipx install uv # pipx

# uv can update
$ uv self update

# check vesion
$ uv --version

3. 基本用法

用户可以快速上手,使用非常无感。

uv 旨在替代 pip-tools 的功能,因此 uv pip compileuv pip sync 提供了与 pip-tools 类似的工作流。如果您之前使用 pip-tools,可以无缝切换到 uv。除了基本功能,uv 还提供了一些高级特性,可以进一步优化您的开发工作流。

> 1. 安装包uv pip install

$ uv pip install requests
$ uv pip install "Django<4" "celery>=5.2"

> 2. 同步依赖uv pip sync

它用于根据锁定文件(requirements.txt、requirements.lock)精确同步虚拟环境中的依赖,这类似于 pip install -r,但 uv 提供了更快的速度和更强的确定性。

$ uv pip sync requirements.txt

uv

> 3. 编译依赖uv pip compile

uv pip compile 类似于 pip-compile,用于根据抽象的依赖(pyproject.tml等)生成一个精确的锁定文件(requirements.txt、requirements.lock)。这个锁定文件包含了所有直接和间接依赖的精确版本。

$ uv pip compile pyproject.tml -o requirements.txt
$ uv pip compile requirements.in -o requirements.txt

4. 高级特性

整合 pip/virtualenv/poetry/pyenv 等 7 大工具功能

在 Python 生态系统中,依赖管理和包安装一直是开发者面临的挑战。传统的 pip 工具虽然功能强大,但在速度、依赖解析和可重复性方面仍有改进空间。近年来,一个新的工具 uv 横空出世,旨在解决这些痛点,并提供一个更快速、更可靠的 Python 包管理体验。

> 1. 替代 virtualenv 特性:虚拟环境管理(python -m venv)

UV 默认在项目目录下,创建并使用虚拟环境。与 pip 默认全局安装不同,执行 uv pip install 时会自动查找当前激活的虚拟环境或项目根目录的 .venv 并安装到其中。这确保了每个项目环境隔离,避免了版本冲突。注意:UV 要在系统环境中安装包需要使用 --system 参数或 UV_SYSTEM_PYTHON=1 开关。

# 初始化项目(创建虚拟环境/.venv)
$ uv venv
$ uv venv --python 3.14 # 指定版本
$ uv venv --seed # 强制安装基础包(pip/setuptools/wheel)

# 安装/升级/删除依赖
$ uv pip install flask
$ uv pip install -U flask
$ uv pip uninstall flask
# 查看更新包
$ uv pip list --outdated

# 激活虚拟环境(与传统方式相同)
$ source .venv/bin/activate

# 退出虚拟环境(与传统方式相同)
$ deactivate

> 2. 使用 uv + pyproject.toml 组合安装依赖

uv 完全支持 pyproject.toml 文件中定义的 [project] 表,用于声明项目的直接依赖。这使得 uv 能够更好地与现代 Python 项目结构集成。

# 使用现代Python项目结构
$ cat pyproject.toml
[project]
name = "my-project"
version = "0.1.0"
dependencies = [
    "requests",
    "Django",
]

# 如果当前目录有pyproject.toml文件
$ uv pip compile pyproject.toml -o requirements.txt
$ uv pip sync requirements.lock

# 运行脚本
$ uv run .\example.py

> 3. 替代 poetry 特性:项目管理与锁定文件

UV 支持在 pyproject.toml 中声明依赖,也兼容 requirements.txtsetup.py 等格式。使用 uv add <包名> 可将新依赖添加到 pyproject.toml 并自动更新锁文件和环境;使用 uv remove <包名> 可将依赖移除。对于老项目,还可通过 uv add -r x.txt 一次性导入所有依赖。

# 初始化项目
$ uv init hello-world
$ uv init hello-world --python 3.14

# 管理依赖
$ cd hello-world
$ uv add 'requests==2.31.0' # 添加生产依赖
$ uv add pytest --dev       # 添加开发依赖
$ uv lock --upgrade-package requests # 更新项目依赖
$ uv remove requests # 删除项目依赖

# 显示项目的依赖项树
$ uv tree --outdated
$ uv tree --depth 2

支持在 pyproject.toml 中的 [tool.uv.index] 配置项里添加自定义索引,比如内部 PyPI 镜像、Azure Artifacts 等等。需要注意的是,与 pip 不同,UV 默认不会自动混用多个索引。如果需要使用镜像源,必须显式配置索引地址,并可通过环境变量或 keyring 插件来指定凭证。

# 项目结构
.
├── .git
├── .gitignore
├── .venv
├── .python-version
├── main.py
├── pyproject.toml
├── README.md
└── uv.lock

# 运行项目脚本
$ uv run main.py

> 4. 替代 pipx 特性:管理全局 CLI 工具

UV 内置对可执行脚本和基于 Python 的 CLI 工具支持,可像运行系统命令一样使用 uv run <脚本> 来执行项目脚本。

# 全局安装black代码格式化工具(类似于pipx)
$ uv tool install black

# 运行全局工具
$ uv tool run black ./myfile.py

# 同时提供更易用的uvx命令(类似于npx)
$ uvx pycowsay 'hello world!'
$ uvx ruff format ./myscript.py

> 5. 替代 pyenv 特性:解决 Python 版本管理

# 查看已安装和可安装的Python版本
$ uv python list

# 安装指定Python版本
$ uv python install 3.13.2

# 使用特定版本运行脚本
$ uvx [email protected] -c "print('hello world')"

> 6. 离线安装和缓存管理

离线安装uv 支持离线安装,这对于在没有互联网连接的环境中部署应用程序非常有用。你可以先将所有依赖下载到本地缓存,然后从缓存进行安装。首先,确保所有依赖都已下载到 uv 的缓存中(通常在 $HOME/.cache/uv 目录)。然后,在离线环境中,您可以指定 uv 只从缓存中安装。

# 这会将它们下载到缓存
$ uv pip install requests Django

# 可以指定uv只从缓存中安装
$ uv pip sync requirements.lock --offline

> 7. 缓存管理uv 会自动缓存下载的包,以加速后续的安装。

缓存优化策略,实测可减少 60% 的 CI/CD 网络流量。

# 查看缓存位置
$ uv cache dir

# 清理缓存
$ uv cache clean
# 预热全局缓存(适用于Docker基础镜像构建)
$ uv cache warmup -r requirements.txt

# 清理无效缓存
$ uv cache purge --older-than 30d

# 共享缓存目录(Kubernetes场景)
$ docker run -v /shared/uv-cache:/cache my-app

5. 最佳实践

uv 的特性使其成为企业级 Python 项目的理想选择!

> 1. 可重复构建

最重要的企业级特性之一,通过 uv pip compile 生成的锁定文件(requirements.lock),可以确保在任何环境中,只要使用相同的锁定文件,就能安装完全相同的依赖版本。

始终使用锁定文件:提交 requirements.lock 或类似名称到版本控制系统;开发与生产环境分离:维护不同的 requirements.in 文件区分版本,并编译生成对应的锁定文件;自动化编译:在 CI/CD 管道中自动化 uv pip compile 步骤,确保锁定文件始终是最新的。

> 2. 安全性考量

企业项目通常有严格的安全要求,需要对所有依赖进行审计,以识别潜在的漏洞。

定期更新依赖:使用 uv pip compile --upgrade 定期更新锁定文件,以获取最新的安全补丁;集成漏洞扫描工具:将 uv 生成的锁定文件与 Snyk、Dependabot 或 Trivy 等漏洞扫描工具集成,自动检测已知漏洞;私有包源:对于内部包,使用 uv --extra-index-url 或在 pip.conf 中配置私有 PyPI 源。

> 3. 与 CI/CD 的集成

uv 的速度优势在 CI/CD 管道中尤为明显,可以显著缩短构建和部署时间。

缓存 uv 缓存目录:在 CI/CD 管道中缓存 uv 的缓存目录(通常是 ~/.cache/uv),以避免重复下载依赖;使用 uv pip sync:在构建步骤中使用 uv pip sync 来精确安装依赖;容器化:在 Docker 镜像构建过程中使用 uv,确保镜像中包含精确的依赖版本。


6. 实战案例

一个中型项目的 UV 流程!

> 1. 初始化项目

使用 uv init 命令创建新项目骨架,该命令会生成 .python-versionREADME.mdmain.pypyproject.toml 等文件。

# 普通使用方式(创建单包项目)
$ uv init mywebapp --python 3.14
$ cd mywebapp

# 与主流框架整合(FastAPI项目模板;创建多包工作区项目)
$ uv project init --template=fastapi my-api
$ uv add "uv[fastapi]" 
$ uv run --reload

uv

> 2. 添加依赖

编辑 pyproject.toml 或使用 uv add 命令添加运行时和开发依赖。uv add 会自动更新 pyproject.tomldependencies/optional-dependencies 和锁文件,并安装到环境。

$ uv add flask gunicorn # 添加生产依赖
$ uv add pytest --dev   # 添加开发依赖

> 3. 创建虚拟环境

第一次运行与依赖相关的命令时,UV 会自动在项目根目录生成 .venv 目录(包含完整虚拟环境)。此后,UV 会在该环境中安装和运行代码,无需手动激活。

# 创建Python3.8兼容环境
$ uv venv --python=3.8 .venv-38

# 激活指定环境
$ source .venv-38/bin/activate

> 4. 锁定依赖

运行锁定命令生成 uv.lock,这会根据当前的 pyproject.toml,解析并记录所有依赖的确切版本到 uv.lock

$ uv lock

> 5. 安装测试

团队成员拉取项目后,只需执行如下命令,即可快速重现相同环境。若项目中有运行或测试脚本,可使用 uv run 执行。

# 同步安装uv.lock中锁定的依赖
$ uv sync
$ uv pip install -r uv.lock

> 6. 日常开发

后续若需要新增依赖,重复使用 uv add,并运行 uv lock 更新锁文件。CI/CD 环境通常只需拉取代码并执行 uv sync,即可自动获取所有新依赖。

# 依赖来源管控(uv.toml/pyproject.toml)
[install]
allowed-sources = [
    "https://pypi.private.com/simple", # 私有制品库
    "https://pypi.org/simple",         # 受监控的公共源
    "https://mirror.trusted.cn/simple" # 经过审计的镜像源
]

# 签名验证(安装时强制校验哈希)
$ uv pip install --require-hashes -r requirements.txt
# 签名验证(生成带哈希的锁定文件)
$ uv pip compile --generate-hashes > requirements.lock

# 审计流程
$ uv pip audit --json > audit.log
$ uv pip audit --cve-id CVE-2024-1234 --verbose # 定向漏洞排查

# 镜像同步(创建企业镜像)
$ uv mirror create --name corp-mirror \
    --upstream https://pypi.org/simple \
    --storage s3://corp-pypi-mirror \
    --schedule "0 2 * * *"  # 每日凌晨同步
# 镜像同步(客户端配置)
$ uv config set install.index-url="https://mirror.corp.com/simple"

7. 总结展望

UV 的最大优势在于 速度快功能全体验统一

uv 是 Python 包管理领域的一个令人兴奋的新工具。其卓越的性能、统一的工作流和对确定性构建的强调,使其成为现代 Python 项目的强大资产。无论您是个人开发者还是企业团队,uv 都能帮助您更高效、更可靠地管理 Python 依赖。


文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录