# 发布新版本

增量更新采用「无感更新」：后台静默准备，就绪后仅弹一次「重启以更新」。

---

## 推荐流程：先本地测试包，再正式发版

1. **打本地测试包（不改版本号、不覆盖 `build\output\`）**  
   - 双击 `scripts\package\pack_local_test.bat`，或在项目根执行：  
     `python scripts/package/pack_local_test.py`  
   - 产物：`build\output_local\ServerManager_Setup_LOCAL.exe`（安装包名为 **ServerManager (本地测试)**，独立 AppId，可与正式版并存）。  
   - 可选：将根目录 `version.json` 同步到 `build\output_local\`（脚本已自动复制）。

2. **本地安装并验证功能**  
   - 确认无问题后再进入发版步骤。

3. **正式发版**  
   - 推荐 **`scripts\package\release.bat 1.0.x`**（先 PyInstaller，再改版本号并同步到 `dist`，再 Inno，最后 `--post-build`）。  
   - 产物在 **`build\output\`**：`ServerManager_Setup.exe`、`version.json` 等，用于上传服务器。

> **说明**：`pack_local_test` **不会**执行 `release.py`，也不会修改 `version.json` / `build_installer.iss` / `src\entrypoints\tk_update_demo.py` / `scripts\update\tk_updater.py` 中的版本号。

### ripgrep（`rg.exe`）

日志检索、匹配高亮与「文件搜索」优先使用 **ripgrep**。打包前请将 **`rg.exe`** 放在 `resources\bin\rg.exe`（可从 [ripgrep Releases](https://github.com/BurntSushi/ripgrep/releases) 下载 Windows 预编译包）。  
`scripts\package\build.bat` 在主程序 PyInstaller 完成后会自动把 `resources\bin\rg.exe` 复制到 `src\dist\ServerManager\rg.exe`（与 `ServerManager.exe` 同目录）；Inno Setup 随 `src\dist\ServerManager\*` 递归打入安装包。若未放置 `rg.exe`，打包会提示警告，安装后仍可通过环境变量 **`RG_PATH`** 或系统 PATH 中的 `rg` 使用。

---

## 一键发版（推荐）

在项目根目录执行：

```bat
scripts\package\release.bat 1.0.4
```

或双击 `scripts\package\release.bat`，按提示输入版本号（如 `1.0.4`）。

脚本将自动完成：**PyInstaller 打包 ServerManager.exe → 更新版本号与 manifest（并同步到 `src\dist\ServerManager\` 内）→ Inno Setup 打安装包 → `--post-build`（复制 version.json 到 `build\output`，并保存 dist 快照）→ 清理打包中间产物**。

> 正式发版统一使用 `build/output` 作为发布目录，manifest 和安装包 URL 均指向 `https://www.sumi.work/api/software/server-manager/...`。

**增量说明**：默认仍可全量发版。需要减少带宽时使用文件级增量 zip，它会比较上一版 `dist\ServerManager` 快照和新版 dist，只打包新增/变化文件，并保留完整安装包作为回退。

---

## 手动发版（可选）

### 1. 修改版本号（三处）

（若使用 `scripts\package\release.bat` 或 `python scripts/package/release.py x.y.z`，请在 **PyInstaller 已成功生成 `src\dist\ServerManager\` 之后** 执行，以便 `version.json` 被同步进安装包目录。）

- **build_installer.iss**：`#define MyAppVersion "x.y.z"` 改为新版本。
- **src\entrypoints\tk_update_demo.py** / **scripts\update\tk_updater.py**：`LOCAL_VERSION = "x.y.z"` 改为新版本。
- **version.json**：
  - `version`：新版本号。
  - `release_notes`：本次更新说明。
  - `download_url` / `full_installer_url`：固定为 `https://www.sumi.work/api/software/server-manager/update-download`。
  - **delta_updates**：不使用增量时保持 `{}`；使用文件级增量时，生成「上一版本 → 当前版本」一项，例如从 1.0.3 升到 1.0.4：
    ```json
    "delta_updates": {
      "1.0.3": {
        "type": "file-zip",
        "format": "server-manager-file-delta-v1",
        "package_url": "https://www.sumi.work/api/software/server-manager/delta-download?from=1.0.3",
        "patch_url": "https://www.sumi.work/api/software/server-manager/delta-download?from=1.0.3",
        "sha256": "",
        "sizeBytes": 0
      }
    }
    ```
    `sha256` / `sizeBytes` 在步骤 3 生成增量包后自动填入。

---

### 2. 打包

与 `scripts\package\release.bat` 等价的手动顺序：

```bat
scripts\package\build.bat
python scripts/package/release.py 1.0.x --notes "说明"
"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" scripts\package\build_installer.iss
python scripts/package/release.py --post-build
```

或仅打安装包（不执行 `scripts\package\release.py`）时用 `scripts\package\pack_all.bat`。得到 `src\dist\ServerManager\`、`build\output\ServerManager_Setup.exe`、`build\output\version.json`。

## 自动更新发布路径

客户端更新入口统一使用 `build/output`：

- manifest：`server_manager/build/output/version.json`
- 完整安装包：`server_manager/build/output/ServerManager_Setup.exe`

发布时上传完整安装包、`version.json`，若启用增量还要上传 `build/output/patches/*.smdelta.zip`。客户端检测到更高版本后会优先下载当前版本对应的增量包；增量校验或应用失败时，回退到 `download_url` / `full_installer_url` 指向的完整安装包。

---

### 3. 生成文件级增量包（可选）

仅当需要「上一版本 → 当前版本」的增量更新时执行。

1. **准备上一版本 dist 快照**。`release.py --post-build` 会自动保存当前版本到：  
   `build/output/snapshots/ServerManager-x.y.z`

2. **生成增量 manifest 项**：在 PyInstaller 成功后、Inno Setup 前执行：

   ```bat
   python scripts/package/release.py 1.0.4 --with-delta --notes "说明"
   ```

3. **打安装包后生成 `.smdelta.zip` 并填 SHA256**：

   ```bat
   python scripts/package/release.py --post-build --old-dist build/output/snapshots/ServerManager-1.0.3
   ```

   生成产物：`build/output/patches/v1.0.3_to_v1.0.4.smdelta.zip`。如果未提供 `--old-dist` 或生成失败，脚本会清空 `delta_updates` 并回退全量更新。

---

### 4. 发布内容

发布 **build\output** 目录即可：

- `build/output/ServerManager_Setup.exe`
- `build/output/version.json`
- `build/output/patches/*.smdelta.zip`（若使用增量更新）

用户通过 `update_url` 拉取 `version.json`，客户端更新服务会后台静默准备增量或全量，就绪后弹「重启以更新」。

---

## 开发计划

- [ ] **查看服务器日志**：支持查看 error/info、角色协议等日志，并支持模糊搜索。
