uv 0.10 系列(0.10.0–0.10.12)变更全解析:破坏性变更迁移、Python 版本管理稳定化与补丁版本修复
【免费下载链接】uvAn extremely fast Python package and project manager, written in Rust.项目地址: https://gitcode.com/GitHub_Trending/uv/uv
本文基于仓库中的 changelogs/0.10.x.md 完整梳理 uv 0.10 系列的发布脉络:0.10.0 的 12 项破坏性变更与 4 项预览功能稳定化,以及 0.10.1 至 0.10.12 共 12 个补丁版本在 Python 解释器支持、Docker 镜像、缓存机制、性能与平台兼容方面的演进。读完本文,你可以掌握从 0.9.x 升级到 0.10.x 的完整迁移清单(含每一项的豁免方式),并结合 crates/uv-cli/src/lib.rs、crates/uv-virtualenv/src/lib.rs 等源码理解这些变更在实现层的落地方式。
0.10.0:为 0.10 系列定调的“谨慎式”大版本
uv 0.10.0 发布于 0.9.0(2025 年 10 月)之后,官方定位是:累积了一批“提升正确性和用户体验、但可能破坏部分工作流”的变更,出于谨慎统一标记为破坏性变更,绝大多数用户可以直接升级而无需修改配置。该版本还稳定化了多项预览功能:
- Python 升级机制稳定化,包括
uv python upgrade命令、uv python install --upgrade标志,以及安装新 Python 时自动升级虚拟环境中的补丁版本; add-bounds与extra-build-dependencies配置项稳定化;uv workspace dir与uv workspace list(用于编写针对 workspace 成员的脚本)稳定化。
同时官方特别提示:uv_build构建后端没有任何破坏性变更,但如果你在[build-system]表中对后端版本设置了上界(如<0.10.0),应将其更新为<0.11.0。
破坏性变更一:uv venv必须显式--clear才能清除已有虚拟环境
此前uv venv在交互式环境下删除已有虚拟环境前会提示确认,在非交互式环境下则不加确认直接删除。0.10.0 起,uv venv要求显式传入--clear标志才会删除已有虚拟环境;该行为在 uv 0.8 中已提前给出警告(见 changelogs/0.8.x.md 的 Breaking changes 小节)。
豁免方式:传入--clear标志,或设置环境变量UV_VENV_CLEAR=1。
从源码可以看到这套参数体系的完整设计,crates/uv-cli/src/lib.rs 中定义了四组互相配合的选项:
--clear(-c):删除目标路径上已有的文件或目录后重建,支持UV_VENV_CLEAR环境变量,采用布尔解析(BoolishValueParser),因此UV_VENV_CLEAR=1、UV_VENV_CLEAR=true都生效;--force:允许--clear删除非虚拟环境的目录(会删除目标路径下所有文件);--no-clear:存在 TTY 时不再交互式提示,直接以错误退出,且优先级高于环境变量(overrides_with = "clear");--allow-existing:不清理、直接在目标路径上写入新环境,官方警告若旧环境与解释器不一致可能导致意外行为。
对应的错误提示逻辑在 crates/uv-virtualenv/src/lib.rs:当目标路径已存在时抛出Exists错误,并自动附带提示 “Use the--clearflag or setUV_VENV_CLEAR=1to replace the existing virtual environment”;若是非虚拟环境目录则提示使用--force。集成测试 crates/uv/tests/python/venv.rs 覆盖了该行为,包括--no-clear覆盖UV_VENV_CLEAR=1的优先级验证(见该文件 L2343 附近的用例注释)。
破坏性变更二:多个 index 同时标记default = true时报错
此前 uv 会静默接受多个default = true的 index 并使用其中第一个;现在只要多个 index 被标记为默认,uv 直接报错。无法豁免,只能将default = true从除一个之外的所有 index 中移除。这类静默歧义被转为显式错误,是 0.10.0 “提升正确性”主题的典型体现。
破坏性变更三:explicitindex 必须命名
explicit(显式)index 只能通过[tool.uv.sources]表使用,而该表要求按名字引用index。此前 uv 会静默接受未命名的 explicit index——但它们永远无法被引用。现在未命名的 explicit index 会直接报错。无法豁免,为其添加name或删除该条目。
破坏性变更四:替代 Python 实现按其实现名安装可执行文件
此前uv python install会把 PyPy、GraalPy、Pyodide 的可执行文件以python3.10之类的名字写入 bin 目录,与 CPython 安装相互冲突。现在这些可执行文件以实现名命名,例如pypy3.10、graalpy3.10、pyodide3.12。无法豁免。
破坏性变更五:uv tool run/uv tool install尊重全局 Python 版本 pin
此前这两个命令忽略通过uv python pin --global设置的全局 Python 版本 pin;现在在未显式请求版本时,它们会使用全局 pin。对uv tool install有两点细节值得注意:
- 若工具已安装,除非提供
--reinstall或--python,否则不会切换 Python 版本; - 若工具当初是用显式
--python安装的,全局 pin 不会覆盖它。
豁免方式:显式提供--python标志。
破坏性变更六:移除部分 Docker 镜像
Debian Bookworm 与 Alpine 3.21 镜像已在 uv 0.9 中被 Debian Trixie 和 Alpine 3.22 取代为默认,本版本正式移除;由于 Trixie / Alpine 基础镜像不再支持 Python 3.8,Python 3.8 系列镜像也一并移除。不再发布的镜像标签:
uv:bookworm、uv:bookworm-slimuv:alpine3.21uv:python3.8-*
迁移方案:用uv:debian或uv:trixie替代uv:bookworm,用uv:alpine或uv:alpine3.22替代uv:alpine3.21,用更新的 Python 版本替代uv:python3.8-*。
破坏性变更七:不再提供 PPC64(大端)预构建二进制
uv 不再发布 PPC64(大端)平台的预构建二进制,官方判断该平台使用极少且只受单个 manylinux 版本支持;PPC64LE(小端)不受影响。从源码构建 uv 在该平台仍然可行。
破坏性变更八:可重定位虚拟环境不再生成activate.csh
此前uv venv --relocatable生成的activate.csh脚本内含硬编码路径,与“可重定位”目标自相矛盾。现在对--relocatable环境直接不生成该脚本。无法豁免。
破坏性变更九:多条凭据匹配同一 URL 时必须指定用户名
通过uv auth login为同一主机注册多组用户名/密码后,此前 uv 在需要认证(例如uv auth token获取令牌)且多条凭据匹配该 URL 时会取第一条匹配项;现在改为直接报错。无法豁免,正确做法是在请求中带上用户名,例如:
uv auth token --username foo example.com破坏性变更十:修改exclude-newer不再使锁文件版本失效
此前修改exclude-newer设置会导致包版本被升级,等于完全忽略锁文件;现在 uv 只在包版本超出新的exclude-newer范围时才变更版本。豁免方式(即恢复旧行为):显式使用--upgrade或--upgrade-package。
破坏性变更十一:uv format升级至 Ruff 0.15.0
uv format现在默认使用 Ruff 0.15.0,采用 Ruff 2026 风格指南,代码格式很可能发生变化。豁免方式:指定旧版本,例如uv format --version 0.14.14。
破坏性变更十二:uv crate 测试特性改用test-前缀
此变更只影响 uv 的分发者:用于门控测试依赖的 Cargo 特性(如pypi)被重命名为带test-前缀的形式(如test-pypi),以便语义清晰。
0.10.0 稳定化的预览功能
uv python upgrade与uv python install --upgrade:安装 Python 版本时会创建一个不带补丁版本号的中间目录(如cpython-3.11下存放3.11.9),虚拟环境会在安装新补丁版本时被透明升级。概念细节可参考 docs/concepts/python-versions.md。实现侧,crates/uv/src/commands/python/install.rs 定义了PythonUpgradeSource(区分Upgrade命令来源与Install的--upgrade来源)与PythonUpgrade枚举(Enabled(source)/Disabled),并贯穿uv python install与uv python upgrade两条命令路径(见 crates/uv/src/lib.rs 中PythonUpgradeSettings::resolve的接线)。uv add --bounds与add-bounds配置项:行为不变,只是不再打印实验性警告。uv workspace list与uv workspace dir:行为不变,只是不再打印实验性警告。注意从源码结构看,crates/uv/src/commands/workspace/list.rs 中对--scripts选项仍有PreviewFeature::WorkspaceListScripts预览门控,说明 workspace 脚本相关能力在 0.10.0 时是分层稳定的。extra-build-dependencies:行为不变,不再打印实验性警告。
0.10.0 其他增强与修复
增强:改进 ABI 标签错误消息措辞;引入 10 秒连接超时;允许在PYX_API_URL不一致时仍把pyx.dev作为uv auth命令的目标。修复:完整支持所有 CPython ABI 标签后缀;支持在 Linux 与 macOS 上检测 PowerShell;对流式传输的超时错误进行重试。
0.10.1 – 0.10.3:稳健性收尾
0.10.1(2026-02-10)
- 读取元数据出错时不再 panic;
- 遇到空的 workspace 成员时跳过而非失败;
- 已存在的只读
sdist-vX/.git不再导致失败; - 文档:在 Python 文档中推荐
uv python update-shell而非uv tool update-shell。
0.10.2(2026-02-10)
- 弃用意外的 ZIP 压缩方法(解压安全面的收紧);
- 修复
cargo-install因缺少uv-test依赖而失败的问题。
0.10.3(2026-02-16)
Python 方面新增 CPython 3.15.0a6。增强:文件锁改为不开启写锁;Windows trampoline 错误信息与 uv 本体保持一致;记录启用了哪些预览功能。预览功能:uv format支持 Ruff 版本约束与exclude-newer;启用target-workspace-discovery时修复脚本路径处理;uv format用版本约束选择默认 Ruff 版本。修复集中在正确性与健壮性:
- 不再按前缀匹配托管 Python 版本(例如指定
cpython-3.1不会误匹配 CPython 3.10); - 修复 Windows 上
--allow-existing对次版本链接的处理; - 遇到不受管理的 workspace 成员时不再 panic;
- 提升请求计时精度;
- 拒绝版本段中的
u64::MAX以防止溢出。
文档方面将 Debian 参考从 Bookworm 改为 Trixie,呼应 0.10.0 的镜像移除。
0.10.4 – 0.10.5:锁文件、NFS 与 Linux 文件复制
0.10.4(2026-02-17)
- 展示
uv python错误时去除受影响路径的重复引用; - 跳过仅含 git 忽略文件的 workspace 成员发现(含子目录);
- 修复在文件系统根目录初始化包时的 panic(如
uv init / --name foo); - 修复
uv_build构建后端产出的wheel/sdist文件权限问题; - 回退锁文件的改动,修复 NFS 挂载点上锁文件的问题。
0.10.5(2026-02-23)
本版本条目较多,值得重点关注三类:
Linux 文件复制路径优化:默认尝试 reflink(#18117),reflink 失败后先回退到硬链接再退化为完整拷贝(#18104)——这条“reflink → hardlink → copy”的降级链在 0.10.6 又补上了文件权限保持的修复。
索引与缓存行为:当命名 index 在父级配置文件中找到时给出提示;uv lock --frozen增加警告;exclude-newer使锁文件失效时的错误信息修正(与 0.10.0 的破坏性变更十形成呼应)。
其他:pylock.toml的 wheel 按 tags 与requires-python过滤;uv publish校验 wheel 文件名已规范化;性能上优化了与某个 extra 反复冲突的求解路径;修复UV_NO_DEFAULT_GROUPS拒绝1等真值的问题、iOS 平台检测、--no-emit-workspace在单成员 workspace 配合--all-packages时的行为;构建并发改为全局信号量;项目级 conflicts 传播到包 extras。
0.10.6 – 0.10.8:Python 版本更新与镜像体系
0.10.6(2026-02-24)
三个修复:对 fork 标记应用锁文件标记规范化;修复脚本requires-python与.python-version冲突时的 Python 版本选择;Linux reflink 保持文件权限(承接 0.10.5 的 reflink 默认化)。
0.10.7(2026-02-27)
修复 Windows Containers on Windows 中 junction 的处理;为中间件重试启用日志;uv 发布产物上传至镜像。
0.10.8(2026-03-03)
本版本引入了新的 Python 版本与一批分发基础设施改进:
- 新增:CPython 3.10.20、3.11.15、3.12.13;
- Docker:新增基于 Docker Hardened Images 的镜像;为 Docker 镜像添加 SBOM 证明;
- 镜像默认化:默认从 Astral 镜像获取 CPython;安装脚本默认从 Astral 镜像下载 uv 发布产物;
- 网络行为:配置 1 秒的最低重试延迟;
uv_build:扩展 direct build 兼容性;- 新配置:新增
UV_INIT_BARE环境变量用于uv init; - 修复:防止
uv tool upgrade安装被排除的依赖;保存工具回执时提升认证策略;脚本中尊重 exclusions;pylock.toml保留默认分支的 Git SHA;--upgrade时尊重 constraints;修复uv tree的孤立根节点与过早去重;URL 依赖跳过已安装 Python 检查。
0.10.9 – 0.10.10:PyTorch 列表、uv audit预览与缓存性能
0.10.9(2026-03-06)
- PyTorch 列表新增
fbgemm-gpu、fbgemm-gpu-genai、torchrec、torchtune、torchcodec(对 AI 基础设施依赖管理是实用的扩展); - 记录出错前的耗时;使用
uv_build相关设置但后端并非uv_build时给出警告; - Linux 系统识别失败时回退到
/usr/lib/os-release; - 构建使用
cargo auditable把 SBOM 纳入 uv 构建产物; - 新配置:
UV_VENV_RELOCATABLE环境变量(呼应 0.10.0 破坏性变更八中的 relocatable 主题); - 性能:避免 toml
Document的额外开销;使用单一全局 workspace 缓存(对大 workspace 的启动与解析有明显意义,从源码结构看这是把 workspace 发现结果在进程内全局复用); - 修复:trampoline 任务分配失败时继续;硬链接数量超限时优雅降级而非失败;workspace 成员尊重构建约束;脚本中重新校验 editables 与其他依赖;Android 上支持 Python 3.13+;支持
cp3-none-any标签;跳过 Windows 上链接到 Python 的损坏工具的虚拟环境。
0.10.10(2026-03-13)
- Python:新增 CPython 3.15.0a7;
- 新增能力:
uv tool list增加--outdated标志(查看已安装工具的过期状态);构建工作流加入 riscv64 musl 目标;Ruff 默认从 Astral 镜像获取; - 缓存:
uv cache clear成为uv cache clean的别名; - 预览功能(
uv audit明显发力):审计输出加入链接;审计输出/报告格式;切换为批量 OSV 查询; - 修复:跨 index 不共享版本元数据;升级 zlib-rs 到 0.6.2 修复 Windows 上大 wheel 解压 panic;过滤不支持环境的 wheel;锁文件保留绝对/相对路径;
uv tool install --force重建 Python 环境;缓存环境尊重时间戳等缓存键;uv export简化所选 extra 的标记;修复 Windows 操作系统与版本上报。
文档方面,平台支持策略新增第三档(tier 3),纳入 freebsd 与 32 位 Windows。
0.10.11 – 0.10.12:解释器支持扩展与生态收尾
0.10.11(2026-03-16)
- Ruff 发布元数据改从 Astral 镜像获取;uv 自身改用 PEP 639 license 元数据;
- 性能:优化 distribution id 的构建性能;
- 修复:
--project可直接指向pyproject.toml,其他文件降级为警告;macOS 上查询解释器时禁用SYSTEM_VERSION_COMPAT;强制支持环境可用的发行版集合;修复UV_PYTHON_INSTALL_DIR为相对路径时uv sync --active误重建活跃环境的问题。
0.10.12(2026-03-19)
- Python:新增 PyPy 3.11.15;支持使用 Python 3.6 解释器(对老系统兼容有实际意义);
- 增强:版本上报包含 uv 的 target triple;
--no-emit-package支持逗号分隔多值; - 预览:
uv audit出现在 CLI 帮助中; - 修复:
uv python list改进托管解释器符号链接的报告;移除依赖时保留上一条目行尾注释;abi3 wheel 的 Python 版本视为下界;检测运行 armv7 用户空间的 aarch64 内核的硬浮点支持。 - 文档:支持版本加入 Python 3.15;Pyodide 移入 Python 支持策略第二档;Rust 与 Python 版本支持移出平台支持策略;Docker 指南按
uv-docker-example的变更更新。
总结:0.10 系列升级路径速查
| 关注点 | 需要做的动作 | 豁免/替代方式 |
|---|---|---|
uv venv覆盖已有环境 | 显式加--clear | 或设置UV_VENV_CLEAR=1;--no-clear可覆盖环境变量 |
| 多默认 index | 只保留一个default = true | 无豁免 |
| 未命名 explicit index | 添加name或删除 | 无豁免 |
| PyPy/GraalPy/Pyodide 可执行名 | 脚本中改用pypy3.10等新名字 | 无豁免 |
| 工具链 Python 版本 | 核对全局 pin 是否符合预期 | 显式--python |
| Docker 镜像 | 换用uv:trixie/uv:alpine3.22/ 新 Python 标签 | 旧标签不再发布 |
| PPC64 大端部署 | 改为源码构建 | 无预构建二进制 |
--relocatable环境的 csh 激活 | 不再依赖activate.csh | 无豁免 |
| 多凭据认证 | 请求带--username | 无豁免 |
exclude-newer变更 | 无需动作(锁文件更稳定) | 需要升版本时加--upgrade |
uv format格式化差异 | 接受 2026 风格或固定 Ruff 版本 | uv format --version 0.14.14 |
从发布节奏看,0.10 系列呈现出清晰的演进轨迹:0.10.0 完成语义收紧(把此前的静默行为全部显式化),0.10.1–0.10.4 集中消化边角 panic 与文件系统问题(NFS、根目录 init、只读目录),0.10.5–0.10.6 打磨 Linux 文件复制与锁文件正确性,0.10.8–0.10.10 建立镜像分发与uv audit预览能力,0.10.11–0.10.12 扩展解释器覆盖面(Python 3.6 解释器支持、CPython 3.15 alpha、PyPy 3.11.15)。如果你正从 0.9.x 升级,最稳妥的路径是:先核对上表中“无豁免”的三项配置类变更,再在 CI 中为uv venv相关流程补上--clear,然后放心地升级到最新的 0.10.12。
参考仓库文件:changelogs/0.10.x.md、crates/uv-cli/src/lib.rs、crates/uv-virtualenv/src/lib.rs、crates/uv-static/src/env_vars.rs、crates/uv/src/commands/python/install.rs、crates/uv/src/commands/workspace/list.rs、crates/uv/tests/python/venv.rs、docs/concepts/python-versions.md。
【免费下载链接】uvAn extremely fast Python package and project manager, written in Rust.项目地址: https://gitcode.com/GitHub_Trending/uv/uv
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考