AGC 客户端随包资源 staging 导致 Cargo 构建永久失效(Windows/macOS 每次重编、macOS dev 无限重建) #519
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
现象
src-tauri下连续两次cargo build --no-default-features分别为 41 / 48 / 65 / 79 秒,从不变 fresh(正常应为秒级Finished)。IDE 的cargo check --all-targets、Windows 本地cargo test --no-run同样重复构建。npm run agc起不来:日志反复刷Info File src-tauri/resources/... changed. Rebuilding application...+Running DevCommand (cargo run ...),实测一轮 28 次以上且不收敛;配套后端与 Vite 都已 ready,只有客户端壳反复重启。thread 'main' panicked at build.rs ... 清理 macOS Codex staging 失败: Os { code: 66, kind: DirectoryNotEmpty },进程树退出。根因(已定位到源码级)
apps/ai-game-creator-shell/src-tauri/build.rs的main()前段依次执行五条 staging(Codex 双架构、Unity helper、Godot gdextension、插件工作区、Cocos payload),全部写进 crate 内的src-tauri/resources/**。而
tauri-build会对bundle.resources里的每个文件发cargo:rerun-if-changed,并把它拷进 target:三份 tauri 配置把
resources/codex/**与resources/plugins列进了随包资源(tauri.windows.conf.json:7-15、tauri.macos.conf.json:8-22;基线配置故意不含)。于是构建期写的文件与 build script 声明的输入是同一批:
判定依据是「输入文件 mtime 比 build script 输出新」,与目录位置无关:把 staging 搬到
target/也躲不开,因为登记的是配置里写的那些路径。关键不是「产物放哪」,而是「构建期有没有人写这些被登记的文件」。证据
CARGO_LOG=cargo::core::compiler::fingerprint=info cargo build --no-default-features→stale: changed "resources/codex/mac-native/darwin-arm64/NOTICE.md",并给出FsStatusOutdated(StaleItem(ChangedFile { reference: build/.../output, stale: .../NOTICE.md }))。.fingerprint/**/run-build-script-build-script-build.json的RerunIfChanged.paths里含resources/plugins/agc-cocos-editor/panels/cocos-editor.html等 staging 目标路径。cargo build第二次 0.25 秒 fresh;npm run agc108 秒后 app 与--agent-runner子进程起来,Rebuilding application由 28+ 降为 0 次(该改动作为症状层验证,不计划合入,见下)。build.rs:465-467),Codex 布局表没有 Linux 三元(for_target("x86_64-unknown-linux-gnu") == None,已有单测断言)。为什么之前两轮修复没有收口
299877b19(2026-09-11).taurignore.taurignore只挡 dev 监听、挡不住 cargo 判定;且只覆盖resources/plugins,resources/codex一直没进710d6dddf(2026-09-23,PR #487)6f012d419(2026-09-18)remove_dir_all(destination_root),把上一条内容比对的幂等又抹掉plugin.json(copy_plugin_file)、Cocos payload、Godot 产物三处仍是无条件写结论:只要 build script 继续写受跟踪路径,就必须为每一处写入维护「无改动不写」,成本随写入点增长。这是结构问题,不是疏漏。
方案方向(待评审)
技术方案:
docs/technical/【技术方案】AGC随包资源staging归位-2026-09-26.md(同批提交含三份里程碑规范与首段实施计划)tauri dev|build之前一次性 staging;缓存 key = 上游 lockfileresolved+integrity+ 布局版本 + 目标三元;临时目录 + 原子替换、所有权与符号链接校验、幂等(命中缓存不重写任何文件)、并发串行化。build.rs退化为只读校验:校验平台目录存在、清单 schema/平台/版本、逐文件 sha256、必需组件齐全,失败 fail closed;只声明真实输入,不再声明任何生成物。.taurignore中与随包资源相关的条目。scripts/stage-node-runtime.mjs在发布前一次性 staging(build-release.mjs:21,427-429),从未进过 build script,因此从无此问题。验收判据(摘)
Finished;cargo:rerun-if-changed输出与 fingerprint 记录中不再出现src-tauri/resources/**。npm run agc一次成功:Rebuilding application为 0 次、Running DevCommand为 1 次,客户端与 Runner 进程稳定存活。check-macos-bundle.mjs全绿;Windows 安装包内coding-agent、plugins、game-runtime/node内容一致)。影响面
cargo check --all-targets)与 Windows 本地 Rust 门禁同样重复构建。相关但不属于本问题
同一条 dev 入口还有一个独立缺陷已修:AGC 客户端 dev 的 Tauri Cargo 直接继承启动器环境,用户级
~/.cargo/config.toml的rustc-wrapper(本机为 sccache)会生效,daemon 状态一坏就在首个 rustc 探测失败(failed to run rustc to learn about target-specific information)。修法是让start-tauri-dev.mjs复用scripts/dev.mjs的buildLocalRustProcessEnv,与npm run dev口径一致;与本次 staging 归位方案互不覆盖,另行提交。进展:M1 + M2 已交付(分支
fix/agc-rust-staging-idempotency,PR #520)M1(单一声明 + 准备步骤 + 构建脚本只读校验)与 M2(dev/发布入口接线 + 构建脚本退出写入)已提交并推送。本机 macOS 实测:
cargo build --no-default-features连续三次 0.69 / 0.22 / 0.22 秒全程 fresh(改造前每次 41–87 秒且从不 fresh)。resources/codex与resources/plugins快照(相对路径/大小/mtime/sha256)逐项不变——构建期不再写随包资源。tauri dev真实 app 全程Rebuilding application0 次、Running DevCommand1 次、主 crate 仅编译 1 次(改造前 28+ 次重建后仍起不来)。package_layout36 passed、build-release39 passed、dev 入口 12 passed;shell typecheck 链、check-config、check:encoding、check:doc-index、rustfmt、eslint、prettier、git diff --check全绿。剩余(M3,需 Windows 真机验收):Unity publish 目录、Godot gdextension、Cocos payload 仍是构建期写入,Windows 的构建新鲜度与打包一致性要在它们归位后复验;
.taurignore的 staging 条目同时保留到那时(提前删会在 Windows 上重新引入监听自触发)。另:完整
npm run agc在本机被 SpacetimeDBPre-publish check(先 401 InvalidSignature、后 502 Bad Gateway,属既有本机环境问题)阻断,dev 侧改用等价探针(手工准备步骤 + 直接tauri dev)取证。既有失败(与本改动无关):
bash scripts/check-repository-ci.sh origin/master失败于scripts/git-hooks.test.mjs:246「hook fixtures do not mutate the calling linked worktree or its index」,在干净的origin/master独立 worktree 上同样复现。