v2.3.3 — Python 版本校验,修复 cmd 撕裂中文行
两个问题出在同一处入口,第二个是在修第一个时撞出来的。
🔍 安装脚本此前不校验 Python 版本
只要 PATH 里有 python 就直接采用。装的是 3.8 时,第 1 步不报错,拖到装依赖时才以 pip 的报错形式暴露 —— 而那时的错误信息指向依赖解析,而非真正的版本问题。
更隐蔽的是:pip 未必报错。旧解释器下它会静默装上一个还支持该版本的老版 pyelftools,其 DWARF 5 支持较弱,崩溃定位随之失准,而全程没有任何提示。
现在第 1 步显式验版:
- PATH 里版本过低时,改从已知安装位置查找合格版本
- 均不可用时,明确告知检测到的版本、来源路径、3.10 的原因,以及 PATH 中旧版排序靠前时的处理办法
requirements.txt 中记录了版本下限的唯一来源是 pyelftools(0.33 起要求 3.10)—— 本套件自身的代码没有用到任何 3.10 专属语法。
不做自动升级是有意为之:静默改动用户的 Python 环境可能破坏其它项目,且需要管理员权限。
🐛 cmd.exe 会把批处理里的中文行拦腰截断
编写上述中文提示时暴露:cmd 按固定块读取批处理文件,跨块边界的多字节字符被撕裂后,行尾残余会被当成命令执行。
期望: 该库 0.33 版起要求 Python 3.10。这是唯一的版本下限来源。
实际: '这是本套件唯一的版本下限来源。' is not recognized as an internal or external command
断在哪一行完全由字节偏移决定 —— 增加一个字节的填充,断点就换位置。因此文件任何位置的编辑都可能让另一行出问题,现有文件"能跑"只是字节布局碰巧合适。
实测 11 种偏移:
| 编码 | 出错次数 |
|---|---|
| UTF-8 无 BOM | 1 / 11 |
| UTF-8 有 BOM | 0 / 11 |
| GBK 无 chcp | 0 / 11 |
三个发布脚本(setup_env.bat、setup_env.ps1、inject_to_project.bat)统一加 UTF-8 BOM。选 BOM 而非 GBK,是因为 GBK 仅在中文 Windows 上正确。此改动同时解决 PowerShell 5.1 将 .ps1 按 ANSI 读取的问题。
🔧 另修两处批处理陷阱
::注释仍会被扫描重定向符。注释中的>=会将该行截断,其后内容被当作命令执行。- 延迟扩展与字面量
!冲突。启用enabledelayedexpansion后,同一行中的字面量[!]与!VAR!会让 cmd 把两个!之间的文本当作变量名展开为空:[!] PATH 里的 Python 是 !PY_BAD!输出为[PY_BAD,...。
🧪 测试
新增 tests/test_setup_scripts.py,覆盖上述四项。离线自测 91 → 96 项。
执行型测试有一处设计要点:逐字节复制发布文件,并通过 PATH 上的 stub python 拦截副作用。截断文件会改变字节偏移,测到的是永远不会发布的布局 —— 该测试的第一版正是这样写的,报出了一个发布版中并不存在的错误。
完成后移除 BOM 复验,测试如期失败,守卫有效。
Full Changelog: v2.3.2...v2.3.3