From 8ac2694eeeb082e6880e9bce3dc90b8949680829 Mon Sep 17 00:00:00 2001 From: "agent.develop" Date: Tue, 22 Sep 2026 17:12:01 +0800 Subject: [PATCH] =?UTF-8?q?build(pbls):=20M9=20=E6=94=B6=E5=8F=A3=E2=80=94?= =?UTF-8?q?=E2=80=94=E8=A1=A5=E9=BD=90=208c=20=E6=A8=A1=E5=9D=97=20wwwroot?= =?UTF-8?q?=20=E6=8C=82=E8=BD=BD=E6=AD=A5=E9=AA=A4=E4=B8=8E=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E4=BE=A7=E5=8F=AF=E8=BE=BE=E6=80=A7=E9=97=A8=E7=A6=81?= =?UTF-8?q?=20+=20=E7=94=9F=E6=88=90=E4=BA=A7=E7=89=A9=E8=BD=AF=E9=93=BE?= =?UTF-8?q?=E6=8E=92=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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(打印生成+挂载两项均已接入) --- .gitignore | 5 +++++ build.sh | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6579d96..7e4417a 100644 --- a/.gitignore +++ b/.gitignore @@ -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/ diff --git a/build.sh b/build.sh index f49dc8d..2738236 100644 --- a/build.sh +++ b/build.sh @@ -113,7 +113,9 @@ done # ---- 8b. M9 覆盖层页面壳生成(构建产物,不入库)+ 一致性门禁 ---- # 页面壳由 pbl_scense_ext 的生成器产出;产物目录 wwwroot/pbl_overlay/ 在模块仓 # .gitignore 中被排除,因此必须在构建期生成,否则新克隆/新部署环境该目录为空、 -# /pbl_overlay/.ui 导航全量 404。位置:模块安装之后、模块 wwwroot 软链之前。 +# /pbl_overlay/.ui 导航全量 404。位置:模块安装之后、模块 wwwroot 软链(紧随其后的 +# 「8c. 模块 wwwroot 挂载」段)之前——生成物落在模块仓,必须再经 8c 挂载到应用 wwwroot +# 才能在应用侧 URL /pbl_scense_ext/pbl_overlay/.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//wwwroot/ 下,但本脚本从未把 +# 模块 wwwroot 挂进应用 wwwroot —— 应用 website.root=wwwroot 只指向应用自身目录, +# 因此 build.sh 跑完后应用侧依然取不到 /pbl_scense_ext/pbl_overlay/.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/.ui 将全量 404,终止部署" +fi +log "应用侧可达性核验通过: ${APP_OVERLAY_DIR}/*.ui = ${APP_UI_COUNT}" + # ---- 9. 语法验证:全部 .py 跑 py_compile(QC 退回意见 #16)---- log "py_compile 全量语法验证" FAIL_SYNTAX=0