Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Server/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@
};

app.MapPost("/Update/Report", handleReport);
app.MapPost("/Upgrade/Report", handleReport);

// ── GET /File/Download/{hash} ───────────────────────────────────
// Serves package files by their SHA256 hash. Supports HTTP Range
Expand Down
225 changes: 225 additions & 0 deletions website/docs/doc/GeneralUpdate.PacketTool.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ GeneralUpdate.Tools 是一款使用 Avalonia 开发的桌面应用程序,支
| 构建补丁包 | 是 | 比较前后版本,识别更新、新增或删除的文件 |
| 构建版本配置 | 是 | 轻松生成版本配置文件 |
| 扩展管理器 | 是 | 打包和管理应用程序扩展 |
| 模拟更新 | 是 | 在本地完整模拟客户端到服务端的更新流程 |
| 配置生成器 | 是 | 分析 .csproj 自动生成 manifest.json 和项目结构 |

![](imgs\tool.png)

Expand Down Expand Up @@ -735,6 +737,229 @@ MyExtension/

---

### 4. 模拟更新

#### 功能介绍

模拟更新是 GeneralUpdate.Tools 最强大的功能之一,能够在本地完整模拟从客户端到服务端的整个更新流程。开发者无需部署真实服务端即可测试和验证更新逻辑。

**模拟更新会对以下流程进行端到端验证:**

1. **输入校验** — 验证 SemVer 版本格式、目录存在性、.NET SDK 版本
2. **环境准备** — 准备应用程序目录
3. **应用发布** — 使用 `dotnet publish` 发布内置的 ClientSample 和 UpgradeSample 测试应用
4. **清单生成** — 在应用目录生成 `generalupdate.manifest.json`
5. **Mock 服务端** — 启动本地 ASP.NET Core 模拟更新服务器
6. **执行更新** — 运行 ClientSample → 下载补丁 → 启动 UpgradeSample → 完成更新
7. **结果验证** — 检查更新是否成功并生成测试报告

#### 模拟架构

```
┌───────────────────────────────────────────┐
│ GeneralUpdate.Tools │
│ │
│ ┌─────────────────────────────────────┐ │
│ │ SimulationService │ │
│ │ Step1: Validate │ │
│ │ Step2: Prepare │ │
│ │ Step3: dotnet publish │ │
│ │ Step4: Start LocalUpdateServer │ │
│ │ Step5: Run ClientSample │ │
│ │ Step6: Verify │ │
│ └──────────────┬──────────────────────┘ │
│ │ │
│ ┌──────────────▼──────────────────────┐ │
│ │ LocalUpdateServer (Mock API) │ │
│ │ POST /Upgrade/Verification │ │
│ │ POST /Upgrade/Report │ │
│ │ GET /patch/{filename} │ │
│ └─────────────────────────────────────┘ │
└───────────────────────────────────────────┘
```

#### 参数说明

| 参数 | 说明 |
|------|------|
| 应用目录 | 存放 ClientSample 和 UpgradeSample 的根目录 |
| 补丁包路径 | 预先准备好的更新补丁包(.zip)路径 |
| 当前版本 | 模拟的客户端当前版本号 |
| 目标版本 | 模拟的更新目标版本号 |
| 平台 | 目标操作系统(Windows / Linux / macOS) |
| 应用类型 | Client / Upgrade |
| 应用密钥 | 服务端验证密钥(与 Configinfo.AppSecretKey 对应) |
| 产品 ID | 产品分支标识 |
| 更新路径 | 自定义更新路径(可选) |
| 服务端口 | 本地模拟服务端端口(默认自动选择) |

#### 使用步骤

**步骤 1:准备补丁包**

使用「补丁包」功能或手动准备一个更新补丁包(`.zip`),放到任意目录。

**步骤 2:配置模拟参数**

1. 打开 GeneralUpdate.Tools,切换到「模拟更新」选项卡
2. 选择应用目录(用于存放测试应用的位置)
3. 选择补丁包文件
4. 填写当前版本号(如 `1.0.0.0`)
5. 填写目标版本号(如 `1.0.1.0`)
6. 选择目标平台
7. 选择应用类型(Client)
8. 填写应用密钥和产品 ID

**步骤 3:启动模拟**

点击「开始模拟」按钮,观察实时日志输出:

```
[Step 1/6] 验证输入参数...
✓ 版本号格式正确
✓ 目录存在
✓ .NET SDK 10.0.0 已安装

[Step 2/6] 准备应用目录...
✓ 已创建应用目录

[Step 3/6] 发布测试应用...
✓ ClientSample 发布成功
✓ UpgradeSample 发布成功

[Step 4/6] 启动模拟服务器...
✓ 服务器已启动: http://127.0.0.1:50432

[Step 5/6] 运行更新流程...
→ 客户端连接服务器...
→ 发现新版本 1.0.1.0
→ 下载补丁包...
→ 解压补丁...
→ 应用差分包...
→ 启动升级助手...
→ 文件替换完成

[Step 6/6] 验证更新结果...
✓ 更新成功!
```

**步骤 4:查看报告**

模拟完成后,工具会生成 `simulation_report.md` 报告文件,包含:

- 模拟配置信息
- 完整时间线
- 各步骤详细日志
- 成功/失败状态

---

### 5. 配置生成器

#### 功能介绍

配置生成器是一个开发者效率工具,能够自动分析 `.csproj` 文件并生成 `generalupdate.manifest.json` 配置文件。它消除了手动编写配置文件的繁琐和出错风险。

**核心能力:**
- 解析 `.csproj` 文件提取 `AssemblyName`、`OutputType`、`TargetFramework`
- 自动填充应用名称、框架版本等字段
- 验证 SemVer 版本号格式
- 生成标准的 `generalupdate.manifest.json`
- 使用 `dotnet publish` 构建并组装示例项目结构

#### 配置管道

配置生成器内部使用 5 步管道处理:

```
CsprojParseStep → SemverValidateStep → ManifestBuildStep
→ UserConfirmStep → FileEmitStep
```

| 步骤 | 说明 |
|------|------|
| **CsprojParseStep** | 解析 Client 和 Upgrade 的 .csproj 文件,提取项目元数据 |
| **SemverValidateStep** | 验证 ClientVersion 和 UpgradeClientVersion 是否为有效 SemVer |
| **ManifestBuildStep** | 将解析结果和用户输入合并,填充 Manifest 模型 |
| **UserConfirmStep** | 预留步骤,CLI 模式下交互确认;GUI 模式下为 no-op |
| **FileEmitStep** | 将 Manifest 序列化为 JSON 写入磁盘 |

#### 参数说明

| 参数 | 说明 |
|------|------|
| Client 路径 | 客户端项目的 `.csproj` 文件路径(必填) |
| Upgrade 路径 | 升级助手项目的 `.csproj` 文件路径(可选) |
| 主应用名称 | 自动从 AssemblyName 提取,可手动覆盖 |
| 客户端版本 | 客户端当前版本号(SemVer 格式) |
| 升级应用名称 | 自动从 Upgrade 项目的 AssemblyName 提取 |
| 升级端版本 | 升级助手当前版本号 |
| 应用类型 | Client / Upgrade |
| 产品 ID | 产品分支唯一标识 |
| 更新路径 | 自定义更新路径(可选) |

#### 使用步骤

**生成清单文件:**

1. 切换到「配置生成」选项卡
2. 点击「浏览」选择 Client `.csproj` 文件
3. (可选)选择 Upgrade `.csproj` 文件
4. 点击「分析」→ 自动提取 `AssemblyName`、`TargetFramework` 等信息
5. 手动填写版本号、应用类型、产品 ID
6. 点击「生成」→ `generalupdate.manifest.json` 写入磁盘
7. 点击「打开目录」查看生成的文件

**生成示例项目结构:**

1. 完成上述步骤 1-5
2. 点击「生成示例结构」
3. 工具自动执行 `dotnet publish` 编译 Client 和 Upgrade 项目
4. 将编译产物和 `manifest.json` 组装为完整的示例目录

#### 生成的 manifest.json 示例

```json
{
"MainAppName": "MyApp.exe",
"ClientVersion": "1.0.0.0",
"AppType": "Client",
"UpdateAppName": "UpgradeSample.exe",
"UpgradeClientVersion": "1.0.0.0",
"ProductId": "2d974e2a-31e6-4887-9bb1-b4689e98c77a",
"UpdatePath": ""
}
```

#### CsprojInfo 提取规则

| .csproj 字段 | 提取目标 |
|-------------|----------|
| `<AssemblyName>` | 应用名称(MainAppName / UpdateAppName) |
| `<OutputType>` | 判断是否为可执行文件 |
| `<TargetFramework>` | 框架信息(如 net10.0) |
| 文件名 | fallback 应用名称 |

---

## 命令行模式 (CLI)

GeneralUpdate.Tools 的 Pipeline 架构支持命令行模式(开发中)。`UserConfirmStep` 即为 CLI 交互确认预留的步骤。

在 CLI 模式下可以集成到 CI/CD 流程:

```bash
# 计划中的 CLI 用法
GeneralUpdate.Tools config generate \
--client ./src/MyApp/MyApp.csproj \
--upgrade ./src/Upgrade/Upgrade.csproj \
--client-version 1.0.0.0 \
--product-id "your-product-id" \
--output ./manifest.json
```

---

## 相关文档

### GeneralUpdate 生态系统
Expand Down
Loading
Loading