Как обновить appsettings.json на основе профиля публикации с помощью .NET Core? - PullRequest
0 голосов
/ 16 ноября 2018

В настоящее время я делаю переход с .NET Framework на .NET Core.В прошлом все настройки моего приложения были в файле Web.config.Когда я добавил новый профиль публикации, я мог щелкнуть правой кнопкой мыши и выбрать «Add Config Transform», который сгенерировал бы вложенный файл Web. {Profile} .config в Web.config, где я мог бы установить параметры приложения, относящиеся к соответствующему профилю.

Теперь в .NET Core я хочу добиться того же эффекта, используя файл appsettings.json вместо файла Web.config.Как я могу создать файл appsettings. {Profile} .json, который будет вложен в мой файл appsettings.json и будет содержать настройки, относящиеся к моему профилю публикации?Конечно, я могу создать файл вручную, но что «связывает» настройки, чтобы они переопределяли appsettings.json при публикации приложения?Есть ли простой способ сделать это в Visual Studio, как я описал для моих старых проектов .NET Framework?Или я что-то упустил?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

... и с момента моего первоначального комментария я обнаружил, что преобразования web.config полностью поддерживаются VS 2017 и MS Build для .NET Core, как только вы поймете, что командам вложения и преобразования не нужно быть частью проекта больше. Больше не используйте команду "Добавить преобразования конфигурации" в вашем файле web.config, если только вы не найдете исправление, которое не повредит файл вашего проекта. Просто добавьте вручную трансформированные версии вашего web.config, и они автоматически будут вложены и запущены при публикации. Да против 2017 года!

Следующее, в вашем web.Release.config очень хорошо работает для установки вашей переменной среды.

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <location>
    <system.webServer>
      <aspNetCore>
        <environmentVariables>
          <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" xdt:Locator="Match(name)" xdt:Transform="SetAttributes" />
        </environmentVariables>
      </aspNetCore>
    </system.webServer>
  </location>
</configuration>

Кроме того, в .NET Core 2.2 вам больше не нужно добавлять дополнительные преобразования набора параметров приложения (отключая переменную среды) в класс запуска. Это по умолчанию ...

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

... автоматически принимает код принятого ответа.

Суть в том, что, как непростительный разработчик Microsoft, я все еще хочу предположить, что мое приложение будет опубликовано только на сервере IIS с использованием MS Build и Web Deploy, и я хотел бы иметь возможность конфигурировать свое приложение через собственный конфиг приложения; и я хочу иметь возможность делать это в Build, а не как команду командной строки публикации или пост-публикации. Если Microsoft или кто-то создаст простой плагин сборки для Visual Studio, который преобразует мой файл appsettings.json, и я опубликую только то, что необходимо для данной среды, я с радостью воспользуюсь им, но я не нашел его или имел время написать еще.

И именно поэтому я обязательно отвечу на вопрос ОП напрямую: AppSettings можно легко перенести из web.config в appsettings.json и, вероятно, следует, если вы понимаете, что ВСЕ файлы appsettings.json опубликованы, и определяется во время выполнения, в отличие от настоящего решения для преобразования, где публикуются только необходимые файлы и настройки, на основе запрошенного профиля. Использование преобразования web.config только для установки переменной среды, необходимой для определения того, какие наборы приложений. {Env} .json файл использовать. Опять же, вся эта дискуссия идет по пути Додо, если мы можем преобразовать наш файл apsettings.json так же, как наш web.config, в соответствии с запросом OP. У меня есть ощущение, что когда-нибудь это произойдет, если еще не произошло.

Да, переход с устаревшей .NET Framework на .NET Core может быть увлекательным занятием. .NET Core - огромный шаг вперед, но есть несколько препятствий, которые нужно преодолеть; особенно для тех, кто был в наследство с самого начала.

0 голосов
/ 16 ноября 2018

но что означает, что «связывает» настройки, чтобы они переопределяли appsettings.json при публикации приложения?

Настройки приложения настраиваются с помощью WebHost в Program.cs

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>();

В реализации webhost.cs фреймворк добавляет настройки приложений к веб-хосту:

config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

Во второй строке добавляется средаспецифический appsettings.В Visual Studio эта переменная среды определена на странице Project Settings -> Debug и называется ASPNETCORE_ENVIRONMENT.По умолчанию он установлен на Development, поэтому при сборке и запуске в Visual Studio файл appsettings.development.json (если он существует) будет загружен и переопределит все соответствующие параметры в файле appsettings.json.

КогдаПри публикации приложения вы можете переопределить это значение, используя переменную среды ОС с тем же именем.Существует иерархия, в которой .NET Core считывает значения и использует политику «последний выиграл».

В настоящее время иерархия:

  1. Файлы (настройки приложений.json, appsettings. {Environment} .json, где {Environment} - текущая среда размещения приложения)
  2. Хранилище ключей Azure
  3. Секреты пользователя (Secret Manager) (только в среде разработки)
  4. Переменные среды
  5. Аргументы командной строки

Поэтому, когда вы публикуете свое приложение, вы можете переопределить среду в хост-ОС с помощью переменной среды.Когда .NET Core запускает ваше опубликованное приложение, оно считывает эти переменные и загружает соответствующий файл appsettings. {Environment} .json.Если значение не установлено или файл для этой среды не существует, то применяются настройки в appsettings.json.

Подробнее о настройке ASPNETCORE_ENVIROMENT можно прочитать здесь

...