117 lines
4.3 KiB
Markdown
117 lines
4.3 KiB
Markdown
# Updater
|
||
|
||
## 📖 Описание
|
||
`Updater` — это инструмент для безопасного обновления приложений.
|
||
Он состоит из двух частей:
|
||
|
||
- **ReleaseUpdater.dll** — библиотека для работы с API Gitea/GitHub:
|
||
- Получение списка доступных версий.
|
||
- Выбор нужной версии.
|
||
- Скачивание архива релиза.
|
||
- События жизненного цикла (`BeforeInstall`, `AfterInstall`, `UpdateFailed`).
|
||
- Запуск обновления либо напрямую (`UpdateInlineAsync`), либо через внешний процесс (`UpdateWithExternalAsync`).
|
||
|
||
- **Updater.exe** — консольное приложение:
|
||
- Принимает параметры (`--zip`, `--installPath`, `--appExe`).
|
||
- Распаковывает архив в папку установки.
|
||
- Перезапускает приложение.
|
||
- Работает как «чистый установщик», чтобы избежать проблем с блокировкой файлов.
|
||
|
||
---
|
||
|
||
## 🏗 Архитектура
|
||
|
||
```
|
||
Solution/
|
||
├─ ReleaseUpdater/ # Class Library (.dll)
|
||
│ ├─ ReleaseUpdaterFacade.cs
|
||
│ ├─ GiteaReleaseProvider.cs
|
||
│ ├─ HttpAssetDownloader.cs
|
||
│ ├─ SemVerService.cs
|
||
│ └─ Models.cs
|
||
│
|
||
├─ Updater/ # Console App (.exe)
|
||
│ ├─ Program.cs
|
||
│ ├─ Core/
|
||
│ │ ├─ IExtractor.cs / ZipExtractor.cs
|
||
│ │ ├─ IInstaller.cs / SafeFileInstaller.cs
|
||
│ │ ├─ IProcessManager.cs / ProcessManager.cs
|
||
│ │ ├─ UpdaterApp.cs
|
||
│ │ └─ Options.cs
|
||
│
|
||
└─ UpdaterSolution.sln
|
||
```
|
||
|
||
---
|
||
|
||
## ⚡ Возможности
|
||
|
||
- Получение списка версий из Gitea API.
|
||
- Обновление до последней или конкретной версии.
|
||
- Два режима обновления:
|
||
- **Inline** — всё внутри DLL.
|
||
- **External** — через Updater.exe.
|
||
- События:
|
||
- `BeforeInstall` — перед установкой.
|
||
- `AfterInstall` — после успешной установки.
|
||
- `UpdateFailed` — при ошибке (автоматический запуск текущей версии).
|
||
- Безопасная установка: бэкап и откат при ошибке.
|
||
|
||
---
|
||
|
||
## 🚀 Использование
|
||
|
||
### В Telegram‑боте
|
||
|
||
```csharp
|
||
// Получение списка версий
|
||
var versions = await ReleaseUpdaterFacade.GetVersionsAsync(apiUrl, token);
|
||
|
||
// Обновление до последней версии
|
||
await ReleaseUpdaterFacade.UpdateInlineAsync(apiUrl, token, installPath, "MyBot.exe", "latest");
|
||
|
||
// Обновление через внешний Updater.exe
|
||
await ReleaseUpdaterFacade.UpdateWithExternalAsync(apiUrl, token, installPath, "MyBot.exe", "3.5.2");
|
||
```
|
||
|
||
### Запуск Updater.exe напрямую
|
||
|
||
```bash
|
||
Updater.exe --zip "C:\Temp\update.zip" --installPath "C:\Apps\MyBot" --appExe "MyBot.exe"
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 Параметры Updater.exe
|
||
|
||
- `--zip <path>` — путь к архиву .zip.
|
||
- `--installPath <dir>` — папка установки.
|
||
- `--appExe <file.exe>` — исполняемый файл приложения.
|
||
- `--restartDelayMs <int>` — задержка перед перезапуском (по умолчанию 500 мс).
|
||
|
||
---
|
||
|
||
## 📦 Коды возврата
|
||
|
||
- `0` — успешное обновление.
|
||
- `2` — ошибка аргументов.
|
||
- `3` — ошибка распаковки.
|
||
- `4` — ошибка установки.
|
||
- `5` — ошибка перезапуска.
|
||
|
||
---
|
||
|
||
## 🛠 Пример сценария
|
||
|
||
1. Бот получает команду `/update latest`.
|
||
2. ReleaseUpdater.dll:
|
||
- Запрашивает список релизов через Gitea API.
|
||
- Скачивает архив последней версии.
|
||
- Вызывает событие `BeforeInstall`.
|
||
- Запускает Updater.exe с параметрами.
|
||
3. Updater.exe:
|
||
- Распаковывает архив.
|
||
- Перезапускает приложение.
|
||
- Возвращает код `0`.
|
||
4. ReleaseUpdater.dll вызывает событие `AfterInstall`.
|