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/ (systemd KEY=value).
  • Применить к сессии не поддерживается: переменные подхватываются после перезапуска login-сессии.

Предположения (ТЗ)

  1. Колонка «Поле» — только имена из appsettings.json, без добавления новых строк вручную.
  2. Значения по умолчанию показываются в UI, в ОС записываются при первом изменении пользователем.
  3. Pixel-perfect вёрстка не требуется; элементы стилизованы по макету (заголовок, DataGrid, кнопки «−» / «×»).

Порт на WPF

Создать Sms.TaskTwo.Wpf, подключить Sms.TaskTwo.Core, Sms.TaskTwo.ViewModels, зарегистрировать IEnvironmentVariableStore так же, как в App.axaml.cs Avalonia-проекта.

Description
No description provided
Readme 124 KiB
Languages
C# 100%