build(pbls): M9 收口——补齐 8c 模块 wwwroot 挂载步骤与应用侧可达性门禁 + 生成产物软链排除

- build.sh 新增「8c. 模块 wwwroot 挂载」:对所有含 wwwroot/ 的 pbl_* 模块执行
  ln -sfn "${mod_dir}/wwwroot" "${APP_DIR}/wwwroot/${mod_name}",并以应用侧路径
  find -L 实测页面壳数=12 作为门禁(不符即 die 终止部署),响应 QC 退回意见 #1/#2
  (生成步骤已接入但可达链路断在挂载环节)
- .gitignore 排除构建期生成的模块 wwwroot 软链(git 中软链非目录,模式不带结尾斜杠),
  并显式反排除应用仓自带的 wwwroot/pbl_overlay/(其 .js 为跟踪文件)
- 选择性 git add:仅 .gitignore 与 build.sh 两个文件,未使用 git add -A、未 add wwwroot/
- 自检:bash -n build.sh rc=0;gen_overlay_pages.py --check rc=0(打印生成+挂载两项均已接入)
This commit is contained in:
agent.develop 2026-09-22 17:12:01 +08:00
parent 1722b560c4
commit 8ac2694eee
2 changed files with 42 additions and 1 deletions

5
.gitignore vendored
View File

@ -10,3 +10,8 @@ dist/
build/
.venv/
venv/
# build.sh「8c. 模块 wwwroot 挂载」生成的模块前端软链(构建产物,不入库)。
# 注意:软链条目在 git 里不是目录,模式不能带结尾斜杠(wwwroot/pbl_*/ 匹配不到软链)。
# 应用仓自带的 wwwroot/pbl_overlay/(pbl_overlay.js 为跟踪文件)仍保持跟踪,故显式反排除。
wwwroot/pbl_*
!wwwroot/pbl_overlay/

View File

@ -113,7 +113,9 @@ done
# ---- 8b. M9 覆盖层页面壳生成(构建产物,不入库)+ 一致性门禁 ----
# 页面壳由 pbl_scense_ext 的生成器产出;产物目录 wwwroot/pbl_overlay/ 在模块仓
# .gitignore 中被排除,因此必须在构建期生成,否则新克隆/新部署环境该目录为空、
# /pbl_overlay/<key>.ui 导航全量 404。位置:模块安装之后、模块 wwwroot 软链之前。
# /pbl_overlay/<key>.ui 导航全量 404。位置:模块安装之后、模块 wwwroot 软链(紧随其后的
# 「8c. 模块 wwwroot 挂载」段)之前——生成物落在模块仓,必须再经 8c 挂载到应用 wwwroot
# 才能在应用侧 URL /pbl_scense_ext/pbl_overlay/<key>.ui 上取到。
OVERLAY_GEN="${WS_DIR}/modules/pbl_scense_ext/scripts/gen_overlay_pages.py"
[ -f "${OVERLAY_GEN}" ] || die "缺少覆盖层页面壳生成器: ${OVERLAY_GEN}(modules/pbl_scense_ext 未就位)"
log "生成 PBL 覆盖层页面壳: ${OVERLAY_GEN}"
@ -132,6 +134,40 @@ if [ "${CHK_RC}" -ne 0 ]; then
fi
log "覆盖层页面壳生成 + 门禁校验通过(12 个页面壳 / i18n key 一致)"
# ---- 8c. 模块 wwwroot 挂载(软链)+ 应用侧可达性门禁(QC 退回意见 #1/#2)----
# 上一版只做了 8b「生成」,生成物落在模块仓 modules/<m>/wwwroot/ 下,但本脚本从未把
# 模块 wwwroot 挂进应用 wwwroot —— 应用 website.root=wwwroot 只指向应用自身目录,
# 因此 build.sh 跑完后应用侧依然取不到 /pbl_scense_ext/pbl_overlay/<key>.ui(可达链路
# 断在挂载环节,全量 404 并未消除)。此处按 web-application-spec「挂载模块 9 步流程」
# 第 5 步(wwwroot 软链,非 cp,保持与模块仓单一副本同步)补齐,并立即以应用侧路径
# 实测 12 个页面壳数量作为门禁,rc≠0 终止部署。
LINKED_MODULES=""
for mod_dir in "${WS_DIR}"/modules/pbl_*; do
[ -d "${mod_dir}/wwwroot" ] || continue
mod_name="$(basename "${mod_dir}")"
www_link="${APP_DIR}/wwwroot/${mod_name}"
# 已存在但不是软链(应用仓自带同名真实目录)时不覆盖,直接终止让人工处置,
# 避免 ln -sfn 把软链建进既有目录里、或静默删掉应用仓跟踪文件。
if [ -e "${www_link}" ] && [ ! -L "${www_link}" ]; then
die "wwwroot 挂载冲突:${www_link} 已存在且不是软链(应用仓自带目录?),请人工处置后重试"
fi
ln -sfn "${mod_dir}/wwwroot" "${www_link}"
LINKED_MODULES="${LINKED_MODULES} ${mod_name}"
done
[ -n "${LINKED_MODULES}" ] || die "未发现任何含 wwwroot/ 的 pbl_* 模块,模块 wwwroot 挂载为空"
log "模块 wwwroot 软链挂载完成:${LINKED_MODULES}"
# 挂载后应用侧可达性门禁:覆盖层页面壳必须能通过应用 wwwroot 路径取到
APP_OVERLAY_DIR="${APP_DIR}/wwwroot/pbl_scense_ext/pbl_overlay"
APP_UI_COUNT=0
if [ -d "${APP_OVERLAY_DIR}" ]; then
APP_UI_COUNT="$(find -L "${APP_OVERLAY_DIR}" -maxdepth 1 -name '*.ui' | wc -l | tr -d '[:space:]')"
fi
if [ "${APP_UI_COUNT}" != "12" ]; then
die "应用侧覆盖层页面壳应为 12 个,实际 ${APP_UI_COUNT}(${APP_OVERLAY_DIR}):模块 wwwroot 未挂载成功或生成器未产出,/pbl_scense_ext/pbl_overlay/<key>.ui 将全量 404,终止部署"
fi
log "应用侧可达性核验通过: ${APP_OVERLAY_DIR}/*.ui = ${APP_UI_COUNT}"
# ---- 9. 语法验证:全部 .py 跑 py_compile(QC 退回意见 #16)----
log "py_compile 全量语法验证"
FAIL_SYNTAX=0