diff --git a/apps/ai-game-creator-shell/src-tauri/src/main.rs b/apps/ai-game-creator-shell/src-tauri/src/main.rs index f3e32ed34..8ed84955a 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/main.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/main.rs @@ -1,9 +1,13 @@ #![cfg_attr(all(not(dev), target_os = "windows"), windows_subsystem = "windows")] -// AGC 壳的 warning 门禁只作用于生产口径:`cfg(not(test))` 让 `cargo check`(不带 `--all-targets`)与发布构建 -// 把 first-party warning 当错误,而 test harness 实例不受影响——同一个 bin target 在 `--all-targets` 下会被 -// 编第二次,其中 `#[cfg(not(test))] fn main()` 被排除,`generate_handler!`/`desktop::run()` 链不可达, -// 会产生一批属测试构建产物的假死告警,不能按废弃生产代码处理。口径与基线见 dev 运维文档「Rust 编译告警门禁」。 -#![cfg_attr(not(test), deny(warnings))] +// AGC 壳的 warning 门禁只作用于「生产口径 + Windows 交付平台」: +// - `cfg(not(test))`:`cargo check`(不带 `--all-targets`)与发布构建把 first-party warning 当错误;test harness +// 实例不受影响——同一个 bin target 在 `--all-targets` 下会被编第二次,其中 `#[cfg(not(test))] fn main()` +// 被排除,`generate_handler!`/`desktop::run()` 链不可达,会产生一批属测试构建产物的假死告警。 +// - `cfg(windows)`:本壳交付面是 WebView2 / Windows;在 Linux 上大量 Windows 专用实现会被整块编掉 +// (acl_repair、Windows 策略路径、编辑器 RPC、process session bridge 等),它们留下的未用项是“编译剔除” +// 的产物而不是废弃生产代码,不能当缺陷处理(本仓 CI 不在外部注入 RUSTFLAGS/-D warnings)。 +// 口径与基线见 dev 运维文档「Rust 编译告警门禁」。 +#![cfg_attr(all(not(test), windows), deny(warnings))] #[cfg(test)] #[path = "../build_support/godot_bundle.rs"] diff --git a/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md b/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md index c810546bb..4fdc2f628 100644 --- a/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md +++ b/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md @@ -372,7 +372,7 @@ npm run check - 落法:workspace 根写 `[workspace.lints.rust] warnings = "deny"`,成员 crate 用 `[lints] workspace = true` 继承;被 `exclude` 或自带 manifest 的独立 crate 各自声明 `[lints.rust] warnings = "deny"`。 - 依据:cargo 只对**目标 crate** 传 `--deny=warnings`,**不改 `RUSTFLAGS`**,因此不会让 CI 的 Rust 编译缓存整体失效(已用一个最小 crate 实证)。缓存边界见本节「Rust 测试组的隔离编译缓存」。 - 覆盖范围:`server-rs` workspace(成员见 `server-rs/Cargo.toml` 的 `members`)、4 个被 `exclude` 的独立 crate(`agent-runtime-core`、`agent-runtime-orchestration`、`editor-adapter-api`、`platform-agent`)、`apps/desktop-shell/src-tauri`、三个编辑器 native bridge;AGC 壳(`apps/ai-game-creator-shell/src-tauri`)已于 2026-10-06 由起始基线 613 条清零,并按下面特例启用生产口径门禁。 -- AGC 壳的门禁落法(特例,不使用 `[lints]` 表):在 `apps/ai-game-creator-shell/src-tauri/src/main.rs` 顶部写 `#![cfg_attr(not(test), deny(warnings))]`;AGC 壳的 `Cargo.toml` 不加 `[lints]`。原因是该 crate 没有 lib 目标,`cargo check --all-targets` 会把同一个 bin target 以 test harness 再编一次;harness 实例里 `#[cfg(not(test))] fn main()` 被排除,`generate_handler!` 注册的 Tauri 命令与 `desktop::run()` 链整体不可达,于是产生一批**属于测试构建产物**的假死告警(2026-10-06 实测 339 条)。若改用 `[lints.rust] warnings = "deny"`,这批 harness 告警会被 deny 而 CI 必红;若逐条用 `cfg` 收敛它们,又会因为 handler 注册仍在编译而报 `E0425`。因此 AGC 壳门禁限定 `cfg(not(test))`,CI 的 `cargo check --features …`(不带 `--all-targets`)与发布构建自动成为门禁。 +- AGC 壳的门禁落法(特例,不使用 `[lints]` 表):在 `apps/ai-game-creator-shell/src-tauri/src/main.rs` 顶部写 `#![cfg_attr(all(not(test), windows), deny(warnings))]`;AGC 壳的 `Cargo.toml` 不加 `[lints]`。两个条件的来历:① `cfg(not(test))`——该 crate 没有 lib 目标,`cargo check --all-targets` 会把同一个 bin target 以 test harness 再编一次;harness 实例里 `#[cfg(not(test))] fn main()` 被排除,`generate_handler!` 注册的 Tauri 命令与 `desktop::run()` 链整体不可达,于是产生一批**属于测试构建产物**的假死告警(2026-10-06 实测 339 条)。若改用 `[lints.rust] warnings = "deny"`,这批 harness 告警会被 deny 而 CI 必红;若逐条用 `cfg` 收敛它们,又会因为 handler 注册仍在编译而报 `E0425`。② `cfg(windows)`——本壳交付面是 WebView2 / Windows,在 Linux 目标上大量 Windows 专用实现被整块编掉(`acl_repair_gate`、Windows 策略路径、编辑器 RPC、process session bridge 等),它们留下的未用项是“编译剔除”的产物而非废弃生产代码;2026-10-06 实测 Linux 下壳内因此报 54 条 `never used`,若门禁不加平台限定会把它们判死。因此门禁落在 Windows 交付平台,CI 的 `cargo check --features …`(不带 `--all-targets`)与发布构建自动成为门禁;CI 不在外部注入 `RUSTFLAGS`/`-D warnings`,Linux 构建只把它们当普通 warning。 - 边界:harness 实例的那批告警**不作为废弃生产代码处理**,也**不在门禁覆盖内**;它们与生产口径的 0 warning 是两个不同目标。可选方向是把 handler 列表抽到 cfg 无关位置以批量消除命令可达链的假死,但“同一个 bin 被编两次”这一事实不变,`--all-targets` 无法归零。 - AGC 壳的测量命令必须带编辑器 feature(`cocos-editor-execute,unity-editor-execute,godot-editor-execute`),否则 `build.rs` 的随包资源校验会 panic;生产口径不带 `--all-targets`,测试口径另加 `--all-targets`(见下方命令块)。 - 收尾判据(对修剪 / 退役清理过的文件):文件名与模块文档承诺的职责必须与删完剩下的内容一致;只剩单个通用工具函数的文件要并回同族模块或改名,不允许留下“名字是业务模块、内容却只剩一个与之无关的工具函数”的空壳(本次 `repository_context.rs` 与 `agent/generation/pass_artifacts.rs` 即按此判据处理:内容分别并入 `agent/redaction.rs` 与 `project/memory.rs`,原文件删除)。