#!/usr/bin/env python3 # -*- coding: utf-8 -*- """生成 M9 覆盖层 12 个页面壳 wwwroot/pbl_overlay/.ui(bricks 纯 JSON)。 【产物定位:构建产物,不入库】 wwwroot/pbl_overlay/*.ui 属生成目录,仓库根 .gitignore 以条目 `wwwroot/pbl_overlay/` 将其排除(module-development-spec「CRUD-Generated wwwroot Directories Must Not Be Git-Tracked」/ QC 退回意见 #3 方案 (b))。可核验: git check-ignore -v wwwroot/pbl_overlay/home.ui # 命中 .gitignore 中的该条目 git ls-files wwwroot/pbl_overlay # 输出为空(无跟踪文件) 本脚本(生成器)与 wwwroot/i18n/*/msg.txt(文案事实源)才是入库的交付物。 【生成时机:已接入应用构建脚本,构建期自动生成 + 自动挂载】 apps/pbls/build.sh 已调用本脚本生成页面壳,并紧随其后以 `--check` 作为门禁 (rc≠0 终止部署并打印原因)——实测 `grep -n gen_overlay_pages apps/pbls/build.sh` 命中。调用位置在模块安装(pip install -e modules/pbl_*)之后、模块 wwwroot 软链 挂载之前,故新克隆/新部署环境执行 build.sh 即自动产出页面壳;若该目录为空, `/pbl_overlay/.ui` 导航会全量 404,构建期门禁即为此前置拦截。 生成物落在**本模块仓** wwwroot/pbl_overlay/ 下,而 play.js 的 pageUrl() 请求的是 应用侧 URL `/pbl_scense_ext/pbl_overlay/.ui`,应用 conf/config.json 的 website.root=wwwroot 只指向应用自身目录——因此 build.sh 在生成与 --check 之后还有 一步「模块 wwwroot 挂载」:对所有含 wwwroot/ 的 pbl_* 模块执行 `ln -sfn "${WS_DIR}/modules//wwwroot" "${APP_DIR}/wwwroot/"`,并以应用侧路径 实测页面壳数=12 作为门禁(不符即终止部署)。只有「生成 + 挂载」两步齐备, 页面壳在应用侧才真正可达;缺挂载 = 生成物在磁盘上但 404(QC 退回意见 #1 根因)。 人工执行 `python3 scripts/gen_overlay_pages.py` 仅用于本地开发调试。 warn_build_integration() 作为常驻前提检查保留:`--check` 每次实测 apps/pbls/build.sh 是否同时含生成调用与 wwwroot 挂载步骤,打印 OK(两项齐备)或 WARN(任一项被回退), 只告警不改变返回码。 为什么需要页面壳:wwwroot/overlay/pbl_overlay_core.js 的 PAGES 注册表 route 指向 `/pbl_overlay/.ui`,play.js 的 pageUrl() 会拼成 `/pbl_scense_ext/pbl_overlay/.ui`;页面壳文件不存在则导航即 404。 页面壳职责(只做壳,不做业务渲染): 1. 打 `data-pbl-page=""` + `data-pbl-overlay-root="1"` 标记 —— play.js hostPageKey() 据此识别当前页、boot() 据此挂载覆盖层根节点; 2. 每个文案节点带 `data-pbl-i18n=""`,正文内嵌中文(首屏零请求可读); loader.js 在切换语言时按 msg.txt 覆盖同名节点(i18n 单一事实源); 3. 提供 `script` actiontype 按钮调用 `PblOverlayLoader.start({page:...})`, 由 loader 按需注入 core/transport/play JS 与 CSS(不在 .ui 里硬写