Phaser 一键发布:发布前自动构建与打包(作者不 build、不打 ZIP) #481

Merged
kdletters merged 2 commits from codex/publish-auto-build into master 2026-09-22 21:03:58 +08:00
Member

解决什么

让作者不需要自己构建、也不需要打 ZIP:AGC 点一次发布,客户端负责装依赖、构建、打包、上传;网页端直接能看到、能玩。这一版先把 Phaser 4 + Vite 这条链路做通并验收,其余技术栈随后补。

主要行为

  • export_local_project_package 变成发布前构建:已有可玩入口(game/index.html / dist/index.html)直接打包;否则解析 game/(AGC 脚手架)或项目根的 npm build 脚本,缺 game/node_modules 时先跑 project.bootstrapnpm install),再复用 project.verify 的受控 npm 运行器执行 npm run build(脚本白名单含 build、禁止项目级 .npmrc 改写语义、有沙箱与超时),最后校验入口并打包。安装/构建失败返回带日志尾部的可操作错误,不回传本地路径。
  • 构建决策抽成 resolve_publish_build_plan:game 子工程优先并要求先装依赖、根 npm 工程回退、没有任何可构建工程时失败关闭。
  • 发行网关补齐根路径:GET /api/game-distribution/releases/{gameId}(含尾斜杠)等价于 index.html,所以入口填「根地址」在本地直连网关时也能玩(生产本来就由每游戏 origin 映射根路径);路由级用例同时覆盖 Cookie 拒绝门。

验证

  • 真实 Phaser 4.2.1 + Vite 7 工程base: './',构建产物 index.html 323 B + assets/index-DZGg_tPs.js 1,388,719 B)走完整发布链路:真实封面/截图直传 → 创建游戏/版本 → 上传 ZIP(370,969 B)→ 送审 → 管理员审核通过 → 网关 index.html 200、bundle 200、nosniff/CORP 正常 → 网页播放页在 allow-scripts 沙箱 iframe 内渲染出 PHASER-PUBLISH-OK 与可点击按钮(点击后计数生效)。
  • npm run check:game-distribution-media-e2e 新增 E2E_PACKAGE_ZIP 支持,可直接把真实构建产物接进这条可重复校验(断言从包内派生入口/资源,不再依赖 fixture 文件名)。
  • cargo test -p api-server game_distribution(18)、AGC publish_build_plan 两条决策用例、AGC/root typecheck、npm run check:encodingcheck:doc-indexcheck:rustfmt、全量 npm test(401 文件 / 4436 用例)、npm run check:repository-ci -- origin/master HEAD 全绿。
  • 已知本机限制:AGC 沙箱内的 npm 执行在本开发机解析失败(仓库既有 project_verification_* 用例同样失败),与本次改动无关;该路径由 CI 镜像(固定 node/npm)覆盖。

后续(本 PR 不含)

  • 其余技术栈的构建接入(Godot / Cocos / Unity 等导出成 web 产物)。
  • 网页端「选平台项目直接发布」也需要服务端侧构建/组装,按同样口径后续补。
## 解决什么 让作者**不需要自己构建、也不需要打 ZIP**:AGC 点一次发布,客户端负责装依赖、构建、打包、上传;网页端直接能看到、能玩。这一版先把 **Phaser 4 + Vite** 这条链路做通并验收,其余技术栈随后补。 ## 主要行为 - `export_local_project_package` 变成发布前构建:已有可玩入口(`game/index.html` / `dist/index.html`)直接打包;否则解析 `game/`(AGC 脚手架)或项目根的 npm `build` 脚本,缺 `game/node_modules` 时先跑 `project.bootstrap`(`npm install`),再复用 `project.verify` 的受控 npm 运行器执行 `npm run build`(脚本白名单含 `build`、禁止项目级 `.npmrc` 改写语义、有沙箱与超时),最后校验入口并打包。安装/构建失败返回带日志尾部的可操作错误,不回传本地路径。 - 构建决策抽成 `resolve_publish_build_plan`:game 子工程优先并要求先装依赖、根 npm 工程回退、没有任何可构建工程时失败关闭。 - 发行网关补齐根路径:`GET /api/game-distribution/releases/{gameId}`(含尾斜杠)等价于 `index.html`,所以入口填「根地址」在本地直连网关时也能玩(生产本来就由每游戏 origin 映射根路径);路由级用例同时覆盖 Cookie 拒绝门。 ## 验证 - **真实 Phaser 4.2.1 + Vite 7 工程**(`base: './'`,构建产物 `index.html` 323 B + `assets/index-DZGg_tPs.js` 1,388,719 B)走完整发布链路:真实封面/截图直传 → 创建游戏/版本 → 上传 ZIP(370,969 B)→ 送审 → 管理员审核通过 → 网关 `index.html` 200、bundle 200、nosniff/CORP 正常 → 网页播放页在 `allow-scripts` 沙箱 iframe 内渲染出 `PHASER-PUBLISH-OK` 与可点击按钮(点击后计数生效)。 - `npm run check:game-distribution-media-e2e` 新增 `E2E_PACKAGE_ZIP` 支持,可直接把真实构建产物接进这条可重复校验(断言从包内派生入口/资源,不再依赖 fixture 文件名)。 - `cargo test -p api-server game_distribution`(18)、AGC `publish_build_plan` 两条决策用例、AGC/root typecheck、`npm run check:encoding`、`check:doc-index`、`check:rustfmt`、全量 `npm test`(401 文件 / 4436 用例)、`npm run check:repository-ci -- origin/master HEAD` 全绿。 - 已知本机限制:AGC 沙箱内的 npm 执行在本开发机解析失败(仓库既有 `project_verification_*` 用例同样失败),与本次改动无关;该路径由 CI 镜像(固定 node/npm)覆盖。 ## 后续(本 PR 不含) - 其余技术栈的构建接入(Godot / Cocos / Unity 等导出成 web 产物)。 - 网页端「选平台项目直接发布」也需要服务端侧构建/组装,按同样口径后续补。
kdletters added 1 commit 2026-09-22 20:41:30 +08:00
Phaser 项目一键发布:发布前自动构建与打包
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
57a72f652c
- AGC:export_local_project_package 改为发布前构建——已有可玩入口直接打包;否则解析 game/(Phaser 4 + Vite 脚手架)或项目根的 npm build 脚本,缺 game/node_modules 时先跑 project.bootstrap(npm install),再走 project.verify 的受控 npm 运行器执行 npm run build,最后校验入口并打包;安装/构建失败返回带日志尾部的可操作错误。
- 新增 resolve_publish_build_plan 纯函数与用例:game 子工程优先并要求先装依赖、根 npm 工程回退、没有可构建工程时失败关闭。
- 后端:发行网关根路径(含尾斜杠)等价于 index.html,路由级用例覆盖 Cookie 拒绝门与根路径;生产仍由每游戏 origin 把根路径映射到该游戏入口。
- 脚本:check:game-distribution-media-e2e 支持 E2E_PACKAGE_ZIP 直接发布真实构建产物,断言从包内派生入口/资源,本地审核入口改为发行网关路径。
- 文档:玩法链路与实施计划记录「作者不构建、不打 ZIP」的 Phaser 发布口径与验证证据。
- 验证:真实 Phaser 4.2.1 + Vite 7 构建产物(相对引用)经发布链路后网关 index.html 200 / assets 1,388,719 B 200,播放页在 allow-scripts 沙箱 iframe 内渲染 PHASER-PUBLISH-OK 且点击交互生效。
kdletters added 1 commit 2026-09-22 20:45:35 +08:00
合并 master:DirectProject 旧消息重解析优化
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m35s
Project CI / Backend tests (pull_request) Failing after 17s
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
b93d15e46e
- 合并 origin/master(a46302846:优化 DirectProject 旧消息重解析导致的会话区卡顿)。
- 自动合并无冲突;Phaser 发布前构建与发行网关根路径改动保持接线。
- 同步目的:满足仓库「PR head 必须包含最新 base」的门禁,随后由 Project CI 复验。
kdletters closed this pull request 2026-09-22 20:52:09 +08:00
kdletters reopened this pull request 2026-09-22 20:52:14 +08:00
kdletters merged commit a56790eaa6 into master 2026-09-22 21:03:58 +08:00
Sign in to join this conversation.