uv 是 Astral 开发的 Python 包与项目管理器,使用 Rust 编写。它把依赖解析、虚拟环境、锁文件、Python 版本、脚本与工具运行、项目构建和发布等能力统一在一个命令行工具中。uv 管理的是 Python 项目及其运行环境;它不是 Python 解释器,也不是 PyPI 这样的软件包仓库。
项目与环境
uv 项目通常使用 pyproject.toml 声明项目元数据和依赖,使用 uv.lock 记录解析后的精确依赖版本,并默认在项目目录的 .venv 中维护虚拟环境。常见命令包括:
uv add pydantic
uv lock
uv sync
uv run python main.py
uv add:把依赖加入项目并更新锁文件与环境。uv lock:解析依赖并创建或更新uv.lock。uv sync:按照锁文件同步项目环境;默认执行精确同步,会移除锁文件未包含的多余包。uv run:在项目环境中运行命令,并在运行前检查锁文件和环境是否需要同步。
uv.lock 是跨平台锁文件。它与只描述允许版本范围的 pyproject.toml 分工:前者保存可复现安装所需的解析结果,后者表达项目希望使用哪些依赖及其约束。应用项目一般应把 uv.lock 提交到版本控制中。
同步选项
uv sync 默认会安装项目依赖、默认依赖组以及当前项目。常见部署命令是:
uv sync --locked --no-dev --no-editable
其中:
--locked要求现有锁文件与项目配置一致;如果需要更新锁文件则报错,而不是在部署时自动修改。--no-dev不把dev开发依赖组同步到环境。--no-editable把当前项目及工作区成员作为普通包安装,而不是让环境直接引用源码目录。它适合容器和服务器部署;源码变化后需要重新构建并同步。
与 pip 的关系
uv 提供兼容常见 pip 工作流的 uv pip 接口,例如 uv pip install 和 uv pip sync,但 uv 不会在内部调用 pip。uv pip 更接近直接操作虚拟环境的低层接口;uv add、uv lock、uv sync 和 uv run 则围绕完整项目、锁文件和自动管理的环境工作。
因此,uv sync --locked --no-dev 在部署意图上接近 Node.js 项目中的 npm ci --omit=dev:两者都强调按照锁文件安装生产依赖。不过 Python 项目还涉及虚拟环境,以及当前项目是否以 editable 模式安装,两者不能逐项等同。
缓存与并发
uv 使用缓存减少依赖的重复下载和构建。缓存目录可以通过 UV_CACHE_DIR 或 --cache-dir 指定;为了获得较好的链接性能,缓存与虚拟环境宜位于同一文件系统。
根据官方缓存说明,uv 的缓存设计支持并发读写,并会通过文件锁保护环境或缓存操作。不要手动修改缓存内部文件;需要清理或回收空间时,应使用 uv cache clean、uv cache clean <包名> 或 uv cache prune。--no-cache 会为单次运行使用临时缓存,适合诊断缓存问题,但长期使用会失去跨次运行复用缓存的收益。
使用边界
uv 覆盖了多个 Python 工具的常见职责,但兼容接口不代表所有边缘行为都与 pip、Poetry、pyenv 或 virtualenv 完全相同。迁移已有项目时,应核对构建后端、私有包索引、平台相关依赖、editable 安装和部署流程;具体参数以官方文档为准。