fix(packaging): build-examples.sh 用新变量名 HMAPDEV 会 unbound variable

## 症状

按注释声称的「兼容」用法传新名,脚本立刻死:

    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 的统一共享内存区未移植)。
This commit is contained in:
JianFeeeee
2026-09-29 15:18:43 +08:00
parent 56c694cd7c
commit 275a054287

View File

@ -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=$?
# 判据是**退出码 + 产物存在**,两者都要。