SMS Task Two — редактор переменных среды
Десктопное приложение на Avalonia (.NET 8) для чтения и изменения пользовательских переменных среды. Ядро, ViewModels и модуль окружения вынесены в переносимые проекты для последующего порта на WPF.
Solution
Файл решения: 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-хост |
Сборка и запуск
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:
EnvironmentVariables:Names— массив имён переменных (обязательно по ТЗ).EnvironmentVariables:CommentsVariableName— служебная переменная с JSON-комментариями (имя → текст).EnvironmentVariables:Defaults— значения по умолчанию, если переменная ещё не существует в ОС.Logging:LogDirectory— каталог логов (по умолчаниюlogs).
Комментарии
Комментарии к полям хранятся в одной переменной среды (например SMS_TASK_TWO_COMMENTS) в формате 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
- Чтение/запись: реестр
HKEY_CURRENT_USER\Environment. - Применить к сессии (
ReloadEnvironment): обновляет env текущего процесса и рассылаетWM_SETTINGCHANGEдля других GUI-приложений.
Linux
- Запись в
~/.config/environment.d/(systemdKEY=value). - Применить к сессии не поддерживается: переменные подхватываются после перезапуска login-сессии.
Предположения (ТЗ)
- Колонка «Поле» — только имена из
appsettings.json, без добавления новых строк вручную. - Значения по умолчанию показываются в UI, в ОС записываются при первом изменении пользователем.
- Pixel-perfect вёрстка не требуется; элементы стилизованы по макету (заголовок, DataGrid, кнопки «−» / «×»).
Порт на WPF
Создать Sms.TaskTwo.Wpf, подключить Sms.TaskTwo.Core, Sms.TaskTwo.ViewModels, зарегистрировать IEnvironmentVariableStore так же, как в App.axaml.cs Avalonia-проекта.