Добавьте файлы проекта.

This commit is contained in:
2025-11-25 07:39:25 +03:00
parent ed6a7e1938
commit 5bbcfb1e76
21 changed files with 793 additions and 0 deletions

116
README.MD Normal file
View File

@@ -0,0 +1,116 @@
# 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`.