开发环境的启动与隔离
Orisumi.Dev 是启动环境的统一入口,每个检出目录运行一套环境,数据卷可选,服务按需启动
背景
人和多个 Agent 会同时修改 Orisumi。改完代码后,需要启动相关的服务,读取日志和追踪,再检查实际行为。
现在启动环境要直接调用 Aspire。端口和数据卷写在 AppHost 的配置中,所以两套环境同时运行会互相冲突,隔离时要手动传入端口和卷名。只验证 API,也要启动文档站和 Web 控制台。运行时的检查写在 README 中,每次由执行的人或 Agent 手动完成。
决定
入口
- Orisumi.Dev 提供启动、停止、查看和读取环境的命令,人和 Agent 使用同一组命令。
- Orisumi.Dev 通过 Aspire 启动环境。AppHost 仍然是资源、依赖关系和启动顺序的唯一来源。
- 环境的状态可以用 JSON 读取,包括已启动的服务、各入口和看板的地址,以及数据库连接。
- Orisumi.Dev 打包为 .NET 全局工具,命令名是
orisumi。
隔离
- 每个检出目录同时运行一套环境。
- 主检出目录使用固定端口。工作树使用分配的端口,分配结果保存在这个工作树的
.artifacts/中。端口包括入口、数据库、看板和遥测接收。 - 需要同时运行不同的代码时,使用工作树。
数据
- 每个检出目录有自己的默认数据卷,默认卷在环境停止后保留。
- 启动时可以改用临时卷。环境停止时,临时卷被删除。
- 启动时可以重建默认卷,卷中的数据全部删除。
按需启动
- 启动时可以选择服务,AppHost 补齐它们的依赖。不选择时启动全部服务。
- NGINX 的配置按服务分成片段,每个服务加载“已启动”或“未启动”的片段。三个入口总是监听,在同一套环境中端口保持不变。
- 转给未启动服务的请求返回
503。
冒烟场景
- 运行时检查写成可执行的场景。场景对运行中的环境执行;检查启动、停止和数据保留的场景自己启动和停止环境。场景的结果和其他验证证据保存在同一个运行目录中。
- 场景按能力划分。第一批是环境场景和 API 场景,之后每个 Observer 一个场景。Observer 的场景对环境运行几轮采样,再通过 API 读回结果。
- 场景写明它的前提,例如本机能力或环境的状态。前提不满足时,场景报告为跳过。
- 写入数据的场景只对使用临时卷的环境执行,场景数据不进入默认卷。
- 热更新和页面由人或浏览器工具检查。
理由
端口分配、卷名和隔离参数需要一个地方统一管理。Orisumi.Dev 已经负责验证,由它同时管理环境,Agent 只需要学一组命令。状态可以用 JSON 读取,Agent 拿到地址就能直接请求。.NET 全局工具在每个平台上用同一种方式安装,命令也相同。
同一个检出目录中的两套进程运行同一份代码,也共用同一份构建输出。watch 模式在每次修改后重新构建,两套进程的构建会互相冲突。同一份代码只需要隔离数据,所以换一个卷就够了;需要隔离代码时,工作树正好提供独立的源码和构建输出。
按需启动由 AppHost 处理,连接字符串、端口和迁移顺序就只写一份。NGINX 的配置片段仍然是普通的 NGINX 配置,可以直接阅读和审查。入口端口保持不变,人和 Agent 不必在每次启动后查地址。服务未启动时返回 503,结果一眼可辨;否则 Web 控制台入口的 /api 请求会落到 Vite 的 SPA 回退上,返回一个看起来正常的首页。
重写期间直接修改 Initial migration,已经应用过它的卷不会再更新表结构,所以默认卷需要能直接重建。
手动步骤每次的做法都可能不同,结果也不进入证据。写成场景后,同一项检查每次的执行方式相同,结果可以查证。按能力划分场景,在场景还少的时候也不会切得过细。
放弃的方案:
- 仓库根目录的 shell 脚本。 Windows 不能直接运行。
- 直接使用
aspire命令和参数。 每次都要手写端口和卷名,用--isolated之后还要另外查询实际分配的端口。 - 在一个检出目录中运行多套环境。 每套环境都要有独立的构建输出目录,复杂度高,能得到的只有数据隔离,而换卷已经能做到。
- 每个服务使用单独的启动脚本。 依赖关系分散在多处,容易互相不一致。
- 部分启动时不运行 NGINX。 入口地址会随所选的服务变化。
代价
- Orisumi.Dev 依赖 Aspire CLI 的命令和输出格式,升级 Aspire 时要核对。
- 安装的
orisumi是安装时的版本,Orisumi.Dev 改动后要重新安装。分支上的 Orisumi.Dev 与安装的版本不同时,用dotnet run运行这个分支的版本。 - 在同一个检出目录中并行验证,需要先创建工作树。
- 工作树删除后,它的默认卷仍然存在,需要另外清理。
- NGINX 的配置分成多个文件。
- 场景要随服务和 Observer 一起维护。
规则位置
- 命令与状态:
tools/Orisumi.Dev/README.md - 资源、端口和数据卷:
tools/Orisumi.AppHost/README.md - 入口转发:
docker/nginx/ - ADR · 后端运行与本地环境
- ADR · 开发验证与测试证据