feat(workspace): add package installation validation
Validate ShrinkSDK Workspace / unity (push) Failing after 8s

This commit is contained in:
2026-08-26 04:50:27 +08:00
parent dcf1099b9c
commit 2dd7f5b14a
7 changed files with 751 additions and 8 deletions
+13 -8
View File
@@ -1,11 +1,11 @@
# ShrinkSDK 当前架构
> 当前基线:2026-08-18
> 当前基线:2026-08-26
> 本文是仓库唯一的当前架构文档。实现与本文冲突时,以源码、`package.json`、asmdef 和自动化验证结果为准,并应在同一变更中修正文档。迁移过程与旧代码地图只保存在 `Docs/Archive/`,不再作为当前设计依据。
## 1. 项目定位
ShrinkSDK 是以 Unity Package Manager 包为发布边界的 SDK 单仓库,不是单个游戏项目。仓库直接拥有 `Assets/Modules/` 下全部包源码;模块目录不再是嵌套 Git 仓库或 gitlink。一次干净克隆应能获得完整源码,Unity 只需要恢复外部 UPM 依赖。
ShrinkSDK 是以 Unity Package Manager 包为发布边界的 SDK Workspace,不是单个游戏项目。`Workspace` 根仓库保留集成工程、场景、跨包验证和文档;`Assets/Modules/` 下每个包是同路径 Git submodule,相邻目录 `.meta` 仍由根仓库追踪,避免 Unity GUID 和既有引用变化。一次干净克隆必须使用递归 submodule 初始化,Unity 只需要恢复外部 UPM 依赖。
它提供四层能力:
@@ -14,13 +14,14 @@ ShrinkSDK 是以 Unity Package Manager 包为发布边界的 SDK 单仓库,不
3. 应用与扩展宿主:ShrinkApp、Starter、ModFramework。
4. 边界适配与生成工具:`*.Integration.*`、共享 IL 后处理器、独立服务器生成器。
当前默认应用主路径是 `ContextLoader``ClassicHost` 和旧 installer 只作为兼容面保留,不再承载新架构能力
当前默认应用主路径是 `ContextLoader``ClassicHost` 仅是既有运行时兼容面;包分发与安装只使用公开 registry、精确 Git 标签或 `Installer` 引导包,不保留旧安装入口
## 2. 开发原则
### 2.1 包是发布边界,asmdef 是编译边界
- 每个 `Assets/Modules/<Module>/package.json` 都必须能被独立 UPM 消费。
- 公开发布先走 `https://git.crash.work/api/packages/ShrinkSDK/npm/``com.cneicy` scoped registryGit 安装只能固定到对应 `vX.Y.Z` 标签,禁止浮动分支。
- 主包不反向依赖集成包;跨模块行为放入 `*.Integration.*` 或 Context adapter。
- asmdef 只声明实际编译依赖,不依靠根工程中偶然存在的程序集。
- 内部包依赖版本必须等于被依赖包自身的 `version`,不接受“根工程能编译所以先放着”的漂移。
@@ -63,14 +64,16 @@ ShrinkSDK 是以 Unity Package Manager 包为发布边界的 SDK 单仓库,不
## 3. 仓库结构
```text
ShrinkSDK/
|-- Assets/Modules/ 20根仓库直接跟踪的 UPM 包
ShrinkSDK Workspace/
|-- Assets/Modules/ 21同路径 Git submodule UPM 包
|-- Assets/Modules/*.meta 根仓库追踪的 Unity 目录 GUID
|-- Assets/Scenes/ 示例与验收场景
|-- Assets/Resources/ 当前应用配置与组合 Profile
|-- GeneratedServers/ 独立 .NET 宿主、生成合同与烟测工程
|-- GeneratedModSdk/ Mod SDK 导出物
|-- Packages/ 根 Unity 工程依赖
|-- Tools/UpmConsumerValidation/ 干净 UPM 消费工程验证
|-- Tools/RepositoryMigration/ 子模块、发布仓库与独立宿主初始化脚本
|-- Docs/Archive/ 已完成迁移与过期地图,仅供追溯
|-- DESIGN.md 唯一当前架构文档
|-- NETWORK_PITFALLS.md 网络实现经验记录,不是架构基线
@@ -86,7 +89,7 @@ ShrinkSDK/
| `com.cneicy.shrink-datasaver` | 2.2.0 | 多槽位存档、设置、迁移、加密、原子写入与备份 |
| `com.cneicy.shrink-command` | 0.2.0 | 路径式命令、权限与同步/异步执行 |
| `com.cneicy.shrink-network` | 0.2.0 | 消息、RPC、权限、诊断、TCP/KCP/Loopback 与服务器生成 |
| `com.cneicy.shrink-mod-framework` | 0.2.0 | 模组发现、依赖、可逆生命周期、命名空间内容覆盖、外部 DLL revision 与 Harmony lease |
| `com.cneicy.shrink-mod-framework` | 0.2.1 | 模组发现、依赖、可逆生命周期、命名空间内容覆盖、外部 DLL revision 与 Harmony lease |
| `com.cneicy.shrink-tutorial` | 0.1.0 | 数据驱动引导、遮罩、锚点、触发与持久化 |
| `com.cneicy.shrink-context-core` | 0.1.0 | 可逆效应、coeffect、fiber、声明式 loader 与诊断 |
| `com.cneicy.shrink-app-core` | 0.1.1 | App 设置、服务门面、ClassicHost 兼容面与宿主协议 |
@@ -101,6 +104,7 @@ ShrinkSDK/
| `com.cneicy.shrink-network-integration-eventbus` | 0.1.1 | 网络事件广播、裁决结果与 delta 去重 |
| `com.cneicy.shrink-network-integration-app` | 0.1.0 | Network App installer/原生 Context 组件 |
| `com.cneicy.shrink-shared-codegen` | 0.1.0 | App、Command、Network 共用的 Editor-only IL 后处理注册表生成器 |
| `com.cneicy.shrink-installer` | 0.1.2 | 安全合并公开 registry、显示诊断并固定版本安装 Starter 或选定模块的 Editor 引导包 |
`ShrinkShared.CodeGen` 不反向引用业务 asmdef,只按程序集名与类型全名读取 Cecil 元数据,因此业务包可以依赖它而不形成包循环。
@@ -221,13 +225,13 @@ Mono 中已加载程序集不能真正卸载。系统只回滚组件实例与效
1. 内部包图检查:全部 `com.cneicy.*` 依赖版本一致、无循环,普通主包不反向依赖 Integration 包。
2. Unity 编译:目标 asmdef 和根项目无编译错误。
3. EditMode 测试:功能测试、Context 生命周期、语义扫描和模板覆写保护。
4. 真实 UPM 消费:`Tools/UpmConsumerValidation/Validate-UpmConsumer.ps1` 创建仓库外形态的临时 Unity 工程,通过 `file:` 安装全部 20 个包,启用 testables,验证包注册、程序集加载并运行 EditMode 测试。
4. 真实 UPM 消费:`Tools/UpmConsumerValidation/Validate-UpmConsumer.ps1` 在递归 submodule 初始化后的 Workspace 中创建仓库外形态的临时 Unity 工程,通过 `file:` 安装全部 21 个包,启用 testables,验证包注册、程序集加载并运行 EditMode 测试。发布后还必须分别验证 registry、精确 Git URL 和 Installer 三种空白消费者工程路径。
5. 独立宿主:生成工程与 RuntimeSmoke 按变更范围构建或运行。
6. 涉及真实生命周期时,仍需在目标场景执行 Play Mode 验收;源码检查和 EditMode 不能替代该路径。
## 10. 已知边界
- ClassicHost、旧 installer 和静态门面仍是兼容层,暂未删除
- ClassicHost 和静态门面仍是运行时兼容层;旧 installer 不再是受支持的包安装入口
- Context 的 intercept 不是进程级沙箱;外部程序集 revision 不可从 Mono 卸载。
- 某些第三方或领域副作用只能补偿,不能保证物理撤回。
- 服务器生成器输出可编译、可注册的合同和扩展点,不推断完整业务规则。
@@ -249,6 +253,7 @@ Mono 中已加载程序集不能真正卸载。系统只回滚组件实例与效
- 当前架构只更新本文。
- 包级使用方式和 API 示例放在各包 README。
- 包源码、标签、独立开发宿主与包级 CI 位于 `https://git.crash.work/ShrinkSDK/<Package>`;发布版本只能由与 `package.json.version` 一致的 `vX.Y.Z` 标签产生。
- `NETWORK_PITFALLS.md` 记录实现经验,不描述当前模块清单。
- `Docs/Archive/CORDIS_MIGRATION.completed.md` 保存迁移论证、阶段记录和历史验收数据。
- `Docs/Archive/codebase-map-2026-05-23/` 保存迁移前代码地图,其中关于 Git 状态、模块规模和测试覆盖的描述均已过期。