## 问题与影响 两套 API 目前共享最终路由装配,但分别实现配置加载、状态初始化、任务启动及监听。 - `Gotcha::run()` 在加载配置前就根据 self.host/self.port 决定地址;配置文件或 `.config(...)` 中的 server 设置不会作为 run 的地址来源。 - `GotchaApp::run()` 则使用 config.server。 - Builder 配置失败时警告并回退 Default;Trait 返回错误。Builder 的宽松策略是已文档化行为,但 API 选择同时决定错误处理策略。 这使同一配置在两套入口下出现不同监听行为和失败语义。 ## 证据与位置 静态沿调用链确认: - [gotcha/src/builder.rs:670](https://github.com/Kilerd/gotcha/blob/4aa39cf134acfeb86f681614ff940fab5016df96/gotcha/src/builder.rs#L670) - [gotcha/src/builder.rs:698](https://github.com/Kilerd/gotcha/blob/4aa39cf134acfeb86f681614ff940fab5016df96/gotcha/src/builder.rs#L698) - [gotcha/src/builder.rs:709](https://github.com/Kilerd/gotcha/blob/4aa39cf134acfeb86f681614ff940fab5016df96/gotcha/src/builder.rs#L709) - [gotcha/src/lib.rs:166](https://github.com/Kilerd/gotcha/blob/4aa39cf134acfeb86f681614ff940fab5016df96/gotcha/src/lib.rs#L166) - [gotcha/src/lib.rs:211](https://github.com/Kilerd/gotcha/blob/4aa39cf134acfeb86f681614ff940fab5016df96/gotcha/src/lib.rs#L211) ## 调整方向 保留用户入口,共享 prepare/build/serve 内部路径。将显式监听参数、Builder 覆盖项、配置文件及默认值的优先级统一定义;严格/宽松加载应是明确策略,不应隐含在 API 选择里。 ## 验收标准 - [x] 同一配置与策略下两套 API 使用相同监听地址和配置错误语义。 - [x] 覆盖显式 listen、host/port 覆盖、config.server、默认值的优先级。 - [x] 显式覆盖项能区分“未设置”和“恰好等于默认值”。 - [x] 非法配置不能在未选择回退策略时静默变成默认配置。 - [x] 状态构造、任务注册及监听失败的执行顺序明确。 - [x] 回归测试驱动真实行为,提供迁移说明。 相关:#30 的后续整合;#85 中 Builder 配置宽松策略;#82 生命周期;#83 env-only 配置。 ## 实现进度 PR #111 已合入(`4369222f0f5f94db9b220f0efa0f18608e0c262b`),11 项 [GitHub CI 检查](https://github.com/Kilerd/gotcha/actions/runs/34809865305)全部通过。 - Builder 与 Trait 共用内部启动流程,配置错误默认严格返回,可通过 `ConfigErrorPolicy` 显式选择回退。 - 监听优先级统一为显式 listen 地址 > 独立 host/port 覆盖 > config.server > 框架默认值。 - 先绑定端口,再初始化状态、路由和任务;上下文包含实际绑定地址,初始化失败释放监听端口。 - 本地默认及全部 feature 测试、Clippy、格式检查通过;包含真实 HTTP 和启动失败路径验证,迁移文档已补充。
Activity