Настройка нескольких сред в WPF /Wix

#c# #wpf #jenkins #.net-core #wix

#c# #wpf #дженкинс #.net-ядро #wix

Вопрос:

У меня есть WPF.Приложение Net Core, я использую Wix для создания installer и Jenkins в качестве своего инструмента CI. На данный момент после фиксации Дженкинс создает проект Wix и отправляет файл output .msi везде, где мне нужно.

В моем приложении у меня есть файл appsettings.json, в котором хранится моя конфигурация. Как вы можете догадаться, я хочу иметь несколько файлов конфигурации, например, appsettings.dev.json, appsettings.qa.json для моих сред разработки и контроля качества.

Каков наилучший способ сделать это?

Прежде всего, я хочу определить env по имени ветки git. Легко получить эту переменную в Jenkins, но что мне делать дальше?

Первым вариантом было иметь 3 файла (по одному на среду) и использовать переменную среды при чтении конфигурации в начале приложения. Для этого требуется, чтобы Дженкинс передал значение в Wix (как?), а Wix создал переменную среды. Мне вроде как не понравился этот способ, потому что он казался очень старомодным. Пожалуйста, поправьте меня, если я ошибаюсь. Кроме того, я подумал, что наличие переменной среды является накладным расходом, поскольку она используется только одним, довольно простым, настольным приложением. И последняя проблема, мы должны хранить все 3 файла на компьютере конечного пользователя.

Вторым вариантом, который я попробовал, было использование 4 файлов appsettings (один основной файл и по одному для каждой среды). Как только Дженкинс распознает среду, он заменяет основной файл файлом, который соответствует среде (например, appsettings.dev.json для ветки разработки). Но это не сработало: основной файл appsettings был обновлен, но когда я запускаю приложение, я вижу, что настройки не меняются. Я проверил, что заменяю файл appsettings перед использованием Wix, но это не помогло.

Итак, я чувствую, что есть простой способ настроить это, кто-нибудь может дать мне подсказку?

Ответ №1:

Хорошо, я не уверен, что это идеальное решение, но я придумал один способ сделать это. В принципе, я создал один файл appsettings.json, содержащий переменную env и раздел для каждой среды. Когда я нажимаю фиксацию, CI записывает имя ветви в переменную env, и приложение использует раздел, называемый целевой ветвью. В целом это выглядит так:

 "environment": "dev",
"dev": {...},
"qa": {...}...