Базовая работа на Linux

This commit is contained in:
2026-06-04 19:24:08 +03:00
parent 72a5392a73
commit e07fc408eb
37 changed files with 1632 additions and 80 deletions

91
README.md Normal file
View File

@@ -0,0 +1,91 @@
# SMS Task Two — редактор переменных среды
Десктопное приложение на **Avalonia** (.NET 8) для чтения и изменения пользовательских переменных среды. Ядро, ViewModels и модуль окружения вынесены в переносимые проекты для последующего порта на **WPF**.
## Solution
Файл решения: [`Sms.TaskTwo.slnx`](Sms.TaskTwo.slnx) (формат XML solution).
## Структура проектов
| Проект | Назначение |
|--------|------------|
| `Sms.Environment` | Интерфейс `IEnvironmentVariableStore` |
| `Sms.Environment.Windows` | User env через реестр `HKCU\Environment` |
| `Sms.Environment.Linux` | `~/.config/environment.d/99-sms-task-two.conf` |
| `Sms.TaskTwo.Core` | Конфигурация, сервис, логирование |
| `Sms.TaskTwo.ViewModels` | MVVM (`CommunityToolkit.Mvvm`) |
| `Sms.TaskTwo.Avalonia` | UI-хост |
## Сборка и запуск
```bash
dotnet restore Sms.TaskTwo.slnx
dotnet build Sms.TaskTwo.slnx
dotnet run --project src/Sms.TaskTwo.Avalonia/Sms.TaskTwo.Avalonia.csproj
```
## Конфигурация
[`src/Sms.TaskTwo.Avalonia/appsettings.json`](src/Sms.TaskTwo.Avalonia/appsettings.json):
- `EnvironmentVariables:Names` — массив имён переменных (обязательно по ТЗ).
- `EnvironmentVariables:CommentsVariableName` — служебная переменная с JSON-комментариями (`имя → текст`).
- `EnvironmentVariables:Defaults` — значения по умолчанию, если переменная ещё не существует в ОС.
- `Logging:LogDirectory` — каталог логов (по умолчанию `logs`).
## Комментарии
Комментарии к полям хранятся в одной переменной среды (например `SMS_TASK_TWO_COMMENTS`) в формате JSON:
```json
{"SMS_MEAL_SERVER_URL":"URL сервера","SMS_MEAL_API_KEY":"ключ API"}
```
Переменная записывается тем же механизмом, что и остальные, и доступна другим процессам после применения окружения ОС.
## Логирование
Класс `Sms.TaskTwo.Core.Logging.ConsoleLog` — дублирует записи в консоль и файл.
По умолчанию для GUI: `logs/test-sms-wpf-app-yyyyMMdd.log`. При вызове `ConsoleLog.Open()` без имени — `test-sms-console-app-yyyyMMdd_HHmmss.log`.
Пример строки:
```
2026-06-04 18:30:01 [INFO] Changed value: SMS_MEAL_SERVER_URL=https://example.com (previous: <none>)
```
## UI
- **Добавить** — создаёт пользовательскую переменную (имя + значение); список имён хранится в env-переменной `SMS_TASK_TWO_CUSTOM_VARS` (JSON-массив). Пользовательские строки подсвечиваются жёлтым, идут после переменных из конфига. **Удалить** у пользовательской переменной убирает её из списка и из user store.
- При старте переменные из `appsettings.json`, отсутствующие в пользовательском хранилище, **создаются автоматически** (со значением из `Defaults` или пустой строкой).
- Строки из конфига **всегда вверху** таблицы (в порядке из `Names`), остальные — ниже по алфавиту.
- Изменение одной строки обновляет только её ViewModel (без пересборки всей таблицы); при переключении «все переменные» строки добавляются/удаляются/переставляются инкрементально.
- **Отображать все переменные** — показывает все переменные процесса; значения можно записать в пользовательское хранилище (реестр / `environment.d`).
- Строки из `appsettings.json` подсвечиваются голубым (`#E3F2FD`).
- Переменные в пользовательском хранилище помечаются **USER** и зелёной полосой; кнопка **Удалить** снимает их из HKCU / `environment.d`.
- Совпадение обоих признаков — фон `#C8E6C9`.
## Платформы
### Windows
- Чтение/запись: `EnvironmentVariableTarget.User` (реестр `HKEY_CURRENT_USER\Environment`).
- После записи отправляется `WM_SETTINGCHANGE`, чтобы обновить env в уже запущенных GUI-приложениях.
### Linux
- Запись в `~/.config/environment.d/99-sms-task-two.conf` (формат systemd `KEY=value`, значения с пробелами в кавычках).
- Чтение: merge всех `*.conf` в `environment.d`, затем fallback на env текущего процесса.
- Для новых login-сессий может потребоваться перелогин или `systemctl --user import-environment` — ограничение systemd, не ошибка приложения.
## Предположения (ТЗ)
1. Колонка «Поле» — только имена из `appsettings.json`, без добавления новых строк вручную.
2. Значения по умолчанию показываются в UI, в ОС записываются при первом изменении пользователем.
3. Pixel-perfect вёрстка не требуется; элементы стилизованы по макету (заголовок, DataGrid, кнопки «−» / «×»).
## Порт на WPF
Создать `Sms.TaskTwo.Wpf`, подключить `Sms.TaskTwo.Core`, `Sms.TaskTwo.ViewModels`, зарегистрировать `IEnvironmentVariableStore` так же, как в `App.axaml.cs` Avalonia-проекта.