diff --git a/.gitignore b/.gitignore index 6cfdb66..a3f61f5 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,7 @@ build/ .venv/ venv/ -# M9 覆盖层页面壳:构建产物,不入库。生成方式=在新克隆/新部署环境显式执行 -# python3 scripts/gen_overlay_pages.py(截至本提交 apps/pbls/build.sh 尚无调用本脚本的步骤, -# 接入构建脚本由 PM 派单跟踪;README「生成产物与入库边界」有可机械核验的前提检查) +# M9 覆盖层页面壳:构建产物,不入库。生成方式=由 apps/pbls/build.sh 在构建期调用 +# python3 scripts/gen_overlay_pages.py 自动生成(已接入,并紧随其后以 --check 作为门禁), +# 本地开发调试可手动执行同一命令;README「生成产物与入库边界」有可机械核验的前提检查 wwwroot/pbl_overlay/ diff --git a/README.md b/README.md index 1ebe2de..7643649 100644 --- a/README.md +++ b/README.md @@ -7,14 +7,14 @@ PBL 覆盖层前端扩展模块(scense / scense_game 之上的 pbl_scense_ext - `wwwroot/pbl_overlay/*.ui`(12 个覆盖层页面壳)是**构建产物,不入库**:仓库根 `.gitignore` 以条目 `wwwroot/pbl_overlay/` 排除该目录 (module-development-spec「CRUD-Generated wwwroot Directories Must Not Be Git-Tracked」)。 -- **生成时机(如实声明,不声称不存在的步骤)**:截至本提交,`apps/pbls/build.sh` - **没有**调用 `scripts/gen_overlay_pages.py` 的步骤——实测 - `grep -n 'gen_overlay_pages' apps/pbls/build.sh` 零命中(该脚本的语法验证步骤为 - py_compile 全量检查,与生成页面壳无关)。因此**新克隆 / 新部署环境必须显式执行** - `python3 scripts/gen_overlay_pages.py`,否则 `wwwroot/pbl_overlay/` 为空目录、 - `/pbl_overlay/.ui` 导航全量 404。把生成步骤接入应用构建脚本(模块安装之后、 - wwwroot 软链之前)不在本模块职权内(`build.sh` 归应用侧所有),已由本任务交付说明 - 冒泡请 PM 派单跟踪;在其落地前,本模块文档不得声称存在一个不存在的构建步骤。 +- **生成时机(已接入应用构建脚本,构建期自动生成)**:`apps/pbls/build.sh` 已调用 + `scripts/gen_overlay_pages.py` 生成页面壳,并紧随其后以 `--check` 作为门禁 + (rc≠0 终止部署并打印原因)——实测 `grep -n 'gen_overlay_pages' apps/pbls/build.sh` + 命中。调用位置在模块安装(`pip install -e modules/pbl_*`)之后、模块 wwwroot 软链 + 之前,因此新克隆 / 新部署环境执行 `build.sh` 即自动产出 `wwwroot/pbl_overlay/*.ui`, + 无需人工干预。人工执行 `python3 scripts/gen_overlay_pages.py` 仅用于本地开发调试。 + 反之,若该目录为空则 `/pbl_overlay/.ui` 导航全量 404——构建期的 `--check` + 门禁就是为此前置拦截。 - 入库的交付物是**生成器与事实源**:`scripts/gen_overlay_pages.py`(生成器)、 `wwwroot/i18n/{zh,en}/msg.txt`(界面文案事实源)、`wwwroot/overlay/*.js|*.css` (覆盖层实现)、`scripts/load_path.py`(RBAC 路径登记)。 @@ -23,9 +23,10 @@ PBL 覆盖层前端扩展模块(scense / scense_game 之上的 pbl_scense_ext ```bash git check-ignore -v wwwroot/pbl_overlay/home.ui # 命中 .gitignore 的 wwwroot/pbl_overlay/ git ls-files wwwroot/pbl_overlay # 空输出(无任何跟踪文件) - # 前提检查:生成步骤是否已接入应用构建脚本;WARN = 尚未接入,新环境须手动生成 + # 前提检查:生成步骤已接入应用构建脚本;未命中 = 接入被回退,须立即修复构建脚本 grep -q gen_overlay_pages ../../apps/pbls/build.sh \ - || echo 'WARN: 生成步骤未接入 apps/pbls/build.sh,新克隆环境需手动执行 scripts/gen_overlay_pages.py' + && echo 'OK: 生成步骤已接入 apps/pbls/build.sh(构建期自动生成页面壳)' \ + || echo 'FAIL: 生成步骤未接入 apps/pbls/build.sh,新克隆环境 wwwroot/pbl_overlay/ 将为空' # 文档口径自检:本模块内不得残留对构建脚本生成步骤的编号化表述(期望 rc=1,零命中) grep -rnE '第 ?9 ?步' . --exclude-dir=.git ; echo "rc=$? (期望 1)" ``` @@ -35,7 +36,9 @@ PBL 覆盖层前端扩展模块(scense / scense_game 之上的 pbl_scense_ext 字面量抄进本文档,README 自身就会成为 grep 的命中项,使「零命中」声明再次不可复现 (QC 复审 #1 指出的正是这类自验声明与实测不符的问题)。 2. 第三条也可由生成器自检代跑:`python3 scripts/gen_overlay_pages.py --check` 会实测 - `apps/pbls/build.sh` 并打印 `OK:` 或 `WARN:`(不改变返回码)。 + `apps/pbls/build.sh` 并打印 `OK:`(当前状态:已接入)或 `WARN:`(接入被回退时)。 + `warn_build_integration()` 作为常驻前提检查长期保留,只告警不改变返回码;真正决定 + 部署成败的是构建脚本内紧随生成之后的那次 `--check` 门禁。 3. 第四条自检的口径边界(QC 复审 #1 要求如实声明,避免后续复检误判):该 grep 的作用域是 **本模块仓库目录**(`modules/pbl_scense_ext`,排除 `.git`),实测 rc=1 零命中;而项目 交付说明 `projects/pbls/docs/02-develop/dev-notes-m9-gitignore-build-integration.md` diff --git a/scripts/gen_overlay_pages.py b/scripts/gen_overlay_pages.py index 39623c5..05770b3 100644 --- a/scripts/gen_overlay_pages.py +++ b/scripts/gen_overlay_pages.py @@ -10,14 +10,15 @@ wwwroot Directories Must Not Be Git-Tracked」/ QC 退回意见 #3 方案 (b)) git ls-files wwwroot/pbl_overlay # 输出为空(无跟踪文件) 本脚本(生成器)与 wwwroot/i18n/*/msg.txt(文案事实源)才是入库的交付物。 -【生成时机:如实声明,不声称不存在的步骤(QC #9 复审改法 b)】 -截至本次提交,apps/pbls/build.sh 中**不存在**调用本脚本的步骤——实测 -`grep -n gen_overlay_pages apps/pbls/build.sh` 零命中。因此新克隆/新部署环境 -必须显式执行 `python3 scripts/gen_overlay_pages.py` 生成页面壳,否则 -wwwroot/pbl_overlay/ 为空目录、`/pbl_overlay/.ui` 导航全量 404。 -把该生成步骤接入应用构建脚本(模块安装之后、wwwroot 软链之前)由 PM 另行派单 -跟踪(本模块不拥有 apps/pbls/build.sh,不在本任务改动范围内);`--check` 会 -调用 warn_build_integration() 实测并打印 WARN,使本声明可机械核验。 +【生成时机:已接入应用构建脚本,构建期自动生成】 +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,构建期门禁即为此前置拦截。 +人工执行 `python3 scripts/gen_overlay_pages.py` 仅用于本地开发调试。 +warn_build_integration() 作为常驻前提检查保留:`--check` 每次实测 apps/pbls/build.sh +并打印 OK(当前状态:已接入)或 WARN(接入被回退时),只告警不改变返回码。 为什么需要页面壳:wwwroot/overlay/pbl_overlay_core.js 的 PAGES 注册表 route 指向 `/pbl_overlay/.ui`,play.js 的 pageUrl() 会拼成 @@ -202,10 +203,10 @@ def warn_build_integration(): if 'gen_overlay_pages' in body: print('[gen_overlay_pages] OK: 生成步骤已接入 %s' % build_sh) else: - print('[gen_overlay_pages][WARN] 生成步骤未接入 apps/pbls/build.sh:' - '新克隆/新部署环境需手动执行 `python3 scripts/gen_overlay_pages.py`,' - '否则 wwwroot/pbl_overlay/ 为空、/pbl_overlay/.ui 全量 404' - '(接入构建脚本由 PM 派单跟踪,见 README「生成产物与入库边界」)') + print('[gen_overlay_pages][WARN] 前提检查失败:apps/pbls/build.sh 内已无本脚本调用,' + '说明构建期自动生成已被回退。新克隆/新部署环境 wwwroot/pbl_overlay/ 将为空、' + '/pbl_overlay/.ui 全量 404,请恢复构建脚本中的生成步骤' + '(见 README「生成产物与入库边界」)') def check(zh, en):