From 275a054287e103401e5a882c925bf73168df45a8 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Tue, 29 Sep 2026 15:18:43 +0800 Subject: [PATCH] =?UTF-8?q?fix(packaging):=20build-examples.sh=20=E7=94=A8?= =?UTF-8?q?=E6=96=B0=E5=8F=98=E9=87=8F=E5=90=8D=20HMAPDEV=20=E4=BC=9A=20un?= =?UTF-8?q?bound=20variable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 症状 按注释声称的「兼容」用法传新名,脚本立刻死: HMAPDEV=... bash package/build-examples.sh linux/amd64 /tmp/out → package/build-examples.sh: line 72: PLUGINDEV: unbound variable (exit 1) 而传旧名一切正常: PLUGINDEV=... bash package/build-examples.sh linux/amd64 /tmp/out → 成功 20 / 失败 0 ## 根因 第 71 行写的是: HMAPDEV="${HMAPDEV:-${PLUGINDEV:-$SDK_ROOT/build/hmapdev}}" 这**只定义了 HMAPDEV**;PLUGINDEV 若未设置就仍是未定义变量。 而紧接着的 72/77/100 三行读的却是 `$PLUGINDEV`: if [ ! -x "$PLUGINDEV" ]; then # ← 未定义 → set -u 下致命 out=$( cd "$dir" && "$PLUGINDEV" build ... ) 于是只有当调用方**恰好传旧名**时 PLUGINDEV 才有值、才工作。 注释说「旧变量名 PLUGINDEV 仍兼容」——兼容的方向反了:是旧名恰好能跑, 新名不能。 ## 为何一直没暴露 发版路径传的正是旧名(build.sh:92 `PLUGINDEV="$dev" ...`), 所以 release 流程一路是绿的。任何人按新名(或根本不传)调用都会撞上。 ## 修法 三处改读 `$HMAPDEV`(第 71 行刚解析出的规范名)。 ## 验证(三种调用方式都要能工作) A) HMAPDEV=... → exit 0,20/20,20 个 .hmap(修复前 exit 1) B) PLUGINDEV=... → exit 0,20/20(向后兼容保持) C) 都不传 → 自动先构建 hmapdev,再 20/20 跨平台也验过:linux/arm64 20/20(19s)、darwin/amd64 20/20(21s); windows 被有意拒绝并给出明确原因(协议 2 的统一共享内存区未移植)。 --- package/build-examples.sh | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/package/build-examples.sh b/package/build-examples.sh index f94cbda..7d4e68d 100644 --- a/package/build-examples.sh +++ b/package/build-examples.sh @@ -68,13 +68,21 @@ fi # 1) 先保证工具链可用:示例必须用**本仓当前源码**构建,否则产物协议与这一版 SDK 不符。 # 允许外部指定(发版脚本会在跨平台构建后把刚产出的工具链路径传进来)。 # 工具链二进制名由 plugindev 改为 hmapdev;旧变量名 PLUGINDEV 仍兼容。 +# +# ★ 下面三处必须读 **HMAPDEV**(上一行刚解析出的规范名)。 +# 曾经读的是 PLUGINDEV:那样只有调用方恰好传旧名时才工作, +# 而新名 HMAPDEV 只被赋给 HMAPDEV 本身、PLUGINDEV 仍是未定义, +# 在 `set -u` 下第一处判断就 "PLUGINDEV: unbound variable" 直接退出。 +# 实测(2026-09-29):HMAPDEV=... → exit 1;PLUGINDEV=... → 20/20 成功。 +# 发版路径传的是旧名(build.sh:92)故一直没暴露——正是「兼容」二字 +# 写在注释里、却没在代码里做到的那种缺陷。 HMAPDEV="${HMAPDEV:-${PLUGINDEV:-$SDK_ROOT/build/hmapdev}}" -if [ ! -x "$PLUGINDEV" ]; then +if [ ! -x "$HMAPDEV" ]; then echo "[examples] 先构建 hmapdev ..." ( cd "$SDK_ROOT/tools/hmapdev" && "$GO" build -o "$HMAPDEV" . ) || { echo "[examples] hmapdev 构建失败,无法继续" >&2; exit 1; } fi -if [ ! -x "$PLUGINDEV" ]; then +if [ ! -x "$HMAPDEV" ]; then echo "[examples] hmapdev 不存在或不可执行:$HMAPDEV" >&2 exit 1 fi @@ -97,7 +105,7 @@ for dir in "$SDK_ROOT"/example/*/; do # 清掉旧产物:残留会让人(和本脚本)误判成功。 rm -rf "$dir/build" "$dir/dist" - out=$( cd "$dir" && "$PLUGINDEV" build --no-bundle --target "$GOOS/$GOARCH" 2>&1 ) + out=$( cd "$dir" && "$HMAPDEV" build --no-bundle --target "$GOOS/$GOARCH" 2>&1 ) rc=$? # 判据是**退出码 + 产物存在**,两者都要。