文章摘要
uv 0.12.0版本发布,包含多项改进以提升正确性、安全性和规范兼容性,可能影响部分工作流。新项目默认使用构建系统,恢复最佳实践项目布局。
文章总结
好的,这是根据您的要求,对原文主要内容进行的中文重述,保留了关键细节,并删减了与主题无关的发布说明和操作指引等细节。
标题:uv 0.12.0 版本发布
核心摘要: uv 0.12.0 版本于2026年7月28日发布。该版本包含了一系列旨在提升正确性、安全性和规范兼容性的变更,这些变更可能会影响部分现有工作流程。尽管多数用户无需修改即可升级,但出于谨慎考虑,许多变更被标记为“破坏性变更”。
主要变更内容:
uv init默认创建打包项目:现在,使用uv init创建的项目会默认声明构建系统(使用uv_build)并被打包。项目源代码将放置在src/example目录下,并包含一个[project.scripts]入口。这使得项目可以被导入、作为依赖安装或作为命令运行。用户可通过uv init --no-package example创建无构建系统的旧式项目布局。拒绝不支持的源码分发包和wheel归档格式:根据PEP 625规范,源码分发包必须使用
.tar.gz格式。uv 现在拒绝.tar.bz2和.tar.xz等旧格式。同时,wheel及其他ZIP归档文件中的条目不得再使用bzip2、LZMA或XZ压缩方法,仅支持存储、DEFLATE或zstd压缩。此举旨在减少压缩依赖并降低处理不可信包时的攻击面。拒绝可能替换Python解释器的wheel文件:uv 现在会拒绝那些在大小写不敏感文件系统(如macOS和Windows)上,其入口点或数据文件可能覆盖虚拟环境解释器的wheel文件。这包括对保留解释器名称(如
Python、python.py、Python.exe)的大小写不敏感变体的检查,以及会安装到解释器路径上的wheel数据文件。优先选择稳定版本,再回退到预发布版本:依赖项在解析过程中可能引入预发布版本要求。uv 现在采用“必要时(if-necessary)”模式,优先尝试稳定版本,仅当没有稳定版本满足约束时才回退到预发布版本。这解决了之前因依赖项元数据中的预发布要求而导致的解析失败问题。用户可通过
--prerelease disallow或--prerelease allow等选项调整此行为。尊重
requirements.txt中的--require-hashes指令:uv pip install和uv pip sync现在会强制执行requirements.txt文件内的--require-hashes指令,启用哈希检查模式。未固定版本或未提供哈希的依赖项将被拒绝。在哈希检查模式下拒绝仅使用MD5哈希:在
--require-hashes模式下,每个依赖项必须至少提供一个安全的哈希值(如SHA-256)。仅提供MD5哈希的依赖项将被拒绝,因为MD5不具备抗碰撞性。拒绝无效的
pylock.toml文件和构件:uv 现在会验证pylock.toml文件是否符合规范。具体包括:packages数组必须存在;文件名必须符合规范(如pylock.toml或pylock.dev.toml);如果构件声明了size,则下载或缓存的构件大小必须与之匹配。当无法加载证书时,仍遵循显式的证书覆盖设置:如果
SSL_CERT_FILE或SSL_CERT_DIR环境变量指向了无效路径或空文件,uv 现在会使用这些覆盖设置替换默认的信任根,即使无法加载任何有效证书。这可能导致HTTPS请求失败,从而确保配置的覆盖意图得到执行。支持
uv pip中与pip兼容的--cert处理:uv pip命令现在接受--cert <path>参数,用于为本次调用指定一个PEM证书包,该包将替换所有其他证书来源(包括系统证书和SSL_CERT_FILE/SSL_CERT_DIR)。相对于传递给
uv run的脚本发现项目:uv run project/script.py现在会从脚本所在的目录开始发现项目,而不是从当前工作目录。这确保了脚本能正确使用其所属项目的依赖环境。清除非虚拟环境目录需要
--force参数:uv venv --clear现在会拒绝清除一个不是虚拟环境的目录。用户必须显式添加--force参数才能执行此操作。初始化项目时拒绝
--project参数:uv init命令现在会拒绝--project参数,因为该参数用于选择现有项目,与初始化新项目的操作矛盾。拒绝缺失或无效的
--project路径:如果--project指向一个不存在的目录或非pyproject.toml文件,uv 现在会立即报错,而不是发出警告后继续执行。发布时跳过文件名未规范化的分发包:
uv publish现在会跳过文件名未使用规范化包名和版本的分发包(如wheel和源码分发包),而不是仅发出警告。根据路径区分名为
base或root的Conda环境:uv 现在会根据路径来识别名为base或root的Conda环境,而不是默认将其视为基础Conda环境。在环境发现过程中拒绝损坏的
.venv符号链接:uv 现在会在遇到损坏的.venv符号链接时停止搜索并报告错误,而不是忽略它并继续在父目录中寻找其他虚拟环境。重新安装匹配的已安装Python补丁版本,而非隐式升级:
uv python install 3.12 --reinstall现在会重新安装已安装的匹配补丁版本(如3.12.6和3.12.7),而不是安装最新的3.12版本。用户需使用--upgrade参数来获取升级行为。--upgrade-group必须指定一个已存在的依赖组:uv lock --upgrade-group docs现在会验证docs依赖组是否存在,如果不存在则会报错。相对于
--directory解析相对索引和查找链接路径:命令行中提供的相对索引和查找链接路径现在会相对于--directory选项指定的目录进行解析。保留提供给
uv add的绝对路径:uv add现在会保留用户提供的绝对路径或file://URL,而不会将其转换为项目相对路径。移除仅以bzip2归档形式提供的旧版PyPy发行版:
uv python install不再提供仅以.tar.bz2格式分发的旧版PyPy补丁版本。用户应请求更新的PyPy补丁版本。禁用注释时省略排除包的注释:当使用
uv pip compile --no-annotate时,之前仍会包含的“排除包”列表页脚现在也被省略了。
评论总结
根据评论内容,主要观点和论据如下:
1. 发布公告与用户反馈
- 开发者woodruffw宣布这是自3月以来的首次重大发布,并欢迎提问。
- 关键引用:
- "This is our first breaking release since March. We’re happy to answer any questions folks have about it."(评分:None)
2. 功能与安全性问题
- 用户yablak关注exclude-newer功能对蠕虫安全的影响,以及如何处理未固定版本的Git仓库依赖。
- 关键引用:
- "thoughts on worm safety w.r.t. exclude-newer, and the right way to handle unpinned git repo deps?"(评分:None)
3. 兼容性与负面评价
- 用户analognoise批评uv与uv2nix的兼容性,认为其“糟糕”。
- 关键引用:
- "uv fucks, especially with uv2nix."(评分:None)
4. 功能需求
- 用户drzhouq询问uv何时能安装gdal(地理空间数据抽象库)。
- 关键引用:
- "When can uv install gdal?"(评分:None)
5. 升级命令改进
- 用户XorNot希望uv提供更直观的升级命令,以自动更新所有依赖到最新版本。
- 关键引用:
- "Are we likely to get an 'uv upgrade' command that makes sense sometime?"(评分:None)
- "It's still very obtuse how to get uv to just try and make all my dependencies the highest version possible."(评分:None)
总结:评论主要围绕uv的发布公告、功能安全性、兼容性问题、特定库安装需求以及升级命令的易用性展开,用户反馈既有正面期待,也有对现有问题的批评。