From 0bb533cfe7db3ff95854e882a8b2095b65796412 Mon Sep 17 00:00:00 2001 From: argszero Date: Wed, 5 Aug 2026 01:15:02 +0800 Subject: [PATCH] =?UTF-8?q?emrg:=20build-release=20=E5=8D=81=E6=AC=A1?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E2=80=94=20pipefail=20=E9=99=B7=E9=98=B1?= =?UTF-8?q?=20+=20Windows=20=E8=B7=AF=E5=BE=84=E8=BD=AC=E6=8D=A2=EF=BC=88r?= =?UTF-8?q?ant=20#13=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #377 引入两个回归(第 10 次 CI 实跑 4 平台全失败): 1. POSIX(macOS/Linux):PYEXE 探测 `ls 4个.exe 2>/dev/null | head -1` 在 `set -euo pipefail` 下,POSIX 平台 .exe 全不存在 → ls 退出码 2 → 管道整体非零 → set -e 杀死脚本。修复:`|| true` 吞掉 ls 失败。 2. Windows:`uv python dir` 返回 Windows 原生路径(C:\...),Git Bash 中 glob `C:\.../cpython-3.13.9-*` 含字面反斜杠无法匹配 → PY_ROOT 定位失败 → cp -R 源不存在 → 脚本退出。修复:`cygpath -u` 转 POSIX(仅 Windows, command -v 探测),并统一 glob 定位(弃用 uname 前缀拼接——Git Bash 返回 MINGW64_NT-* 不可用),定位失败显式报错退出。 验证: - bash -n OK - set -euo pipefail 下 POSIX(无 .exe)/ Windows(有 .exe)双场景模拟通过 - 本机 macOS 实跑 build-runtime.sh 完整成功:runtime built OK(83M), python→python-dist/bin/python3.13 相对软链正确,python 3.13.9 可执行, version.txt=0.2.0 - pytest 464 passed;import checks OK --- packaging/build-runtime.sh | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/packaging/build-runtime.sh b/packaging/build-runtime.sh index fd4acb39..c557d5b4 100755 --- a/packaging/build-runtime.sh +++ b/packaging/build-runtime.sh @@ -25,12 +25,19 @@ mkdir -p "$DIST/bin/python-dist" "$DIST/bin" "$DIST/source" "$DIST/lib" "$DIST/a # ── 1. standalone CPython(uv python install 3.13.9,锁 patch 版 R69)── echo "==> installing standalone python $PY_VER" uv python install "$PY_VER" >/dev/null -# R69:standalone 位于 `uv python dir`(R45 实测目录名 cpython-3.13.9---none/); +# R69/R89:standalone 位于 `uv python dir`(R45 实测目录名 cpython-3.13.9---none/); # `uv python find` 在 venv 存在时返回 venv 路径,不可用于定位。 -PY_ROOT="$(uv python dir)/cpython-3.13.9-$(uname -s | tr '[:upper:]' '[:lower:]')-$(uname -m)-none" -if [ ! -x "$PY_ROOT/bin/python3.13" ]; then - # 动态 glob 兜底(架构名差异) - PY_ROOT="$(ls -d "$(uv python dir)"/cpython-3.13.9-* | head -1)" +# R89 修复:uname -s 在 Git Bash 返回 MINGW64_NT-*(≠ windows)前缀拼接不可靠; +# uv python dir 在 Windows 返回原生路径(C:\...),Git Bash 中反斜杠 glob 无法匹配 +# → 一律 glob 定位 + cygpath 转 POSIX(Windows 仅)+ `|| true` 防 pipefail(set -euo)。 +PY_DIR="$(uv python dir)" +if command -v cygpath >/dev/null 2>&1; then + PY_DIR="$(cygpath -u "$PY_DIR")" +fi +PY_ROOT="$(ls -d "$PY_DIR"/cpython-3.13.9-* 2>/dev/null | head -1 || true)" +if [ -z "$PY_ROOT" ] || [ ! -d "$PY_ROOT" ]; then + echo "error: cannot locate standalone python under $PY_DIR" >&2 + exit 1 fi # R45:整目录复制(只复制 bin/python3.13 会缺 lib/libpython3.13.dylib) cp -R "$PY_ROOT/." "$DIST/bin/python-dist/" @@ -41,8 +48,9 @@ cp -R "$PY_ROOT/." "$DIST/bin/python-dist/" # Windows 检测:uname -s 在 Git Bash 返回 MINGW64_NT-*(≠ windows),不可靠; # 改为文件系统探测——Windows standalone python 布局为 python.exe/python3.13.exe # 在根目录(无 bin/),POSIX 布局为 bin/python3.13。探测到 .exe 即走复制分支。 + # `|| true`:POSIX 平台 4 个 .exe 全不存在时 ls 非零,pipefail 下需吞掉。 PYEXE="$(ls python-dist/python3.13.exe python-dist/python.exe \ - python-dist/bin/python3.13.exe python-dist/bin/python.exe 2>/dev/null | head -1)" + python-dist/bin/python3.13.exe python-dist/bin/python.exe 2>/dev/null | head -1 || true)" if [ -n "$PYEXE" ]; then # Windows:Git Bash 的 ln -s 需管理员权限(软链创建失败)→ 用复制替代 cp "$PYEXE" python.exe