Repository navigation
Commit ce80359
committed
P1 协议子 ID lock 持久化分配
## 问题
`MessageHelper.MessageIdHandler` 历史上按行序自增分配 `Opcode`,proto 文件插入/重排/删除 message 会导致整个模块的 SubId 全线平移,连带 C#/C++/Go/Lua/TS 五个 helper 全部错位。线上协议与历史消息包的对接会因此被破坏。
## 方案
新增 `ProtoExport/Persistence/` 模块,把 (Module, Name) → SubId 的映射持久化到 lock JSON 文件:
- `MessageIdLock`:数据模型,`SortedDictionary` 保证序列化按 key 排序便于 PR diff。
- `MessageIdLockStore`:原子写(.tmp + replace),schema 版本不匹配 / module key 越界直接抛 `InvalidDataException`,绝不静默重排。
- `MessageIdAllocator.Mutate`:决策表 —— Messages 命中沿用 / Retired 命中恢复为活跃 / 新消息 `max+1`(含 retired 占用)/ 缺失消息进 Retired 永不回收。
- `MessageIdCoordinator.AssignAndPersist`:跨文件按 Module 聚合 → Mutate → Save。
- `LockSeedGenerator`:一次性迁移,把当前 Opcode 1:1 序列化为 lock 起点。
## 接入点
- `MessageHelper.SkipAutoAssignOpcode`:lock 模式下 Parse 不自增,Opcode 全留 0 等 Coordinator 统一分配。
- `LauncherOptions.MessageIdLockPath`:CLI 选项 `--messageIdLockPath`,空字符串保留旧自增行为(向后兼容)。
- `Program.cs` 新增 `--print-lock` 与 `--regenerate-lock` 两个子命令。
- `tools/migrate-message-id-lock.sh`:一次性迁移脚本,先尝试 `Protobuf/Tools/ProtoExport.dll`,否则回退 `dotnet run`,传 `--isServer true` 以冻结全部模块(含 server-only)。
## 文档
README 新增「子 ID 稳定性(lock 文件)」章节,覆盖:问题(行序自增的代价)、lock 机制、迁移步骤(含「不回滚历史漂移」声明)、merge conflict 处理。
## 测试
`ProtoExporterGUI.Tests` 已加 `ProjectReference` 指向 `ProtoExport`,4 套测试 58 用例全绿:
- `MessageIdAllocatorTests`:首次分配起点 10 / 中间插入 / 重排 / 删除→Retired / 重命名 / 幂等 / 多模块独立 / schema 校验 / 往返等价 / Opcode 写回断言。
- `MessageIdCoordinatorTests`:跨文件续号 / 整体重排与插入 / 删除→Retired / 多模块互不影响 / Lock 损坏报错。
- `LockSeedGeneratorTests`:冻结当前 Opcode 作为起点 / Seed 后 Coordinator 沿用 / Opcode 非法/超界报错 / 格式化与序列化等价。
- `MessageIdLockScenarioTests`:端到端修改性矩阵(基线 + A 插入 / B 重排 / C 删除 / D 重命名 / 回归重跑基线)。
CLI 真实集成(TestProtos 5 模块)也跑了 A 中间插入 / B 整体重排 / C 删除 / D 重命名 / E 重命名回归 / 损坏 lock 拒绝 / schema 不兼容拒绝 —— 全部通过。
## 向后兼容
未传 `--messageIdLockPath` 时走旧路径,行为零变化。所有现有导出脚本不受影响。
## 后续 PR
PR2(`feat/proto-messageid-lock-gui`):GUI 状态面板(基于本 PR head)。1 parent ebdf904 commit ce80359
17 files changed
Lines changed: 1948 additions & 26 deletions
File tree
- ProtoExporterGUI.Tests
- ProtoExport
- Persistence
- tools
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
76 | 76 | | |
77 | 77 | | |
78 | 78 | | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
79 | 85 | | |
80 | 86 | | |
81 | 87 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
67 | 67 | | |
68 | 68 | | |
69 | 69 | | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
70 | 80 | | |
71 | 81 | | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
72 | 88 | | |
73 | 89 | | |
74 | 90 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
0 commit comments