Python 生态强大,但包管理长期是工程效率的瓶颈。pip 慢、环境不可复现、CI 构建时间爆炸,这些问题在中大型项目中尤为明显。uv 的出现,正在成为越来越多团队的默认选择。
本文将从工程实践出发,详细介绍:
一、uv 是什么?为什么它突然火了
一句话概括:
uv 是一个用 Rust 编写的 Python 包管理器,目标是统一 pip、virtualenv、pip-tools、poetry 中最常用的能力,并把速度拉到极致。
uv 的核心特征:
⚡ 极快:并发下载 + 并行依赖解析
📦 统一入口:依赖管理、虚拟环境、锁文件
🔁 强可复现性:Lockfile 是一等公民
🧩 完全兼容 PyPI / pip 生态
它不是“新生态”,而是对现有 Python 生态的工程级升级。
二、uv 安装方式
方式一:官方脚本(最推荐)
curl -LsSf https://astral.sh/uv/install.sh | sh
验证安装:
方式二:Homebrew(macOS)
⚠️ 不建议通过 pip install uvuv 官方明确表示:这会回到 pip 的性能与 bootstrap 问题
三、快速上手:uv 的基本使用流程
1️⃣ 初始化项目
uv init myprojectcd myproject
默认生成:
myproject/├── pyproject.toml├── uv.lock└── .venv/
说明:
.venv:项目级虚拟环境
uv.lock:强依赖锁定文件
pyproject.toml:依赖声明源
2️⃣ 添加依赖(替代 pip install)
uv 会自动完成:
依赖解析
安装到 .venv
更新 pyproject.toml
生成 / 更新 uv.lock
3️⃣ 同步依赖(CI / 生产环境)
语义非常重要:
严格按照 uv.lock 安装,不做依赖解析
这是工程化场景中最推荐的方式。
4️⃣ 运行命令(不需要 activate)
uv run python main.pyuv run pytestuv run uvicorn app:app
👉 这点在 CI / Docker / 脚本里极其舒服。
四、uv 的配置详解与最佳实践
这一节是真实项目中最有价值的部分。
1️⃣ 依赖声明最佳实践
✅ 永远只手写「直接依赖」
[project]dependencies = [ "fastapi", "uvicorn", "requests"]
❌ 不要手写传递依赖❌ 不要在多个地方维护版本
👉 一切版本解析交给 uv.lock
2️⃣ uv.lock 的使用原则(非常重要)
推荐规则
✅ 提交 uv.lock 到 Git
✅ 本地开发:uv add
✅ CI / 生产:uv sync
原因
3️⃣ Python 版本约束最佳实践
在 pyproject.toml 中明确声明:
[project]requires-python = ">=3.10,<3.13"
好处:
避免团队成员 Python 版本不一致
CI / 本地行为完全一致
提前暴露不兼容问题
4️⃣ 多环境依赖管理(dev / test / prod)
uv 推荐使用 optional-dependencies:
[project.optional-dependencies]dev = ["pytest", "ruff", "mypy"]
使用方式:
👉 比 requirements-dev.txt 更清晰、更可维护。
5️⃣ CI 中的推荐用法(通用模板)
# 安装 uvcurl -LsSf https://astral.sh/uv/install.sh | sh# 同步依赖uv sync --frozen# 执行测试uv run pytest
--frozen 的含义:
❌ 禁止修改 uv.lock✅ 确保 CI 只验证,不“偷偷升级依赖”
6️⃣ Docker 场景下的最佳实践
推荐思路
在 Docker 中 只执行 uv sync
利用 uv 的缓存层加速构建
示例:
COPY pyproject.toml uv.lock ./RUN uv sync --frozen --no-dev
效果:
7️⃣ 从 pip / requirements.txt 平滑迁移
老项目可以这样开始:
uv pip install -r requirements.txt
然后逐步:
生成 pyproject.toml
固化 uv.lock
切换到 uv sync
👉 不用一次性推翻旧体系
五、什么时候该用 uv?
非常适合
Web / 后端 Python 项目
FastAPI / Django / Flask
微服务、CI、Docker
对构建速度和可复现性有要求的团队
暂不推荐
深度依赖 conda-forge 的科研环境
极度依赖 poetry 插件生态的老项目
六、结语:uv 的真正价值
uv 不是“又一个包管理工具”,而是 Python 工程化长期缺失的那块拼图。
如果你已经在追求:
那么,uv 值得成为你下一个项目的默认选择。
如果这篇文章对你有启发,欢迎关注!
文章推荐
SSH 常用命令行参数详解:从能连上到玩出花
Linux网络诊断-自顶向下逐层排障的工程方法论和工具