Использовать нужный appsettings при публикации IIS

Рейтинг: 4Ответов: 2Опубликовано: 06.04.2023

При публикации сайта на сервер мне приходится вручную копировать appsettings настройки из файла appsettings.Developpement в файл appsettings. Как и где можно контролировать эту часть?

приложение Blazor Web

Поделюсь подробно, как я сделала:

введите сюда описание изображения

Использую сервис для appsettings, сейчас не смогу найти ссылку, где именно нашла это решение. Пример класса сервис

namespace VashProject.AppSettings
{
    public static class ApplicationServicesSettings
    {
        public const string MySettings = "MySettings";
        public static Class MyClassValue { get; set; } = new MyClassValue();
    }

    public class MyClassValue
    {
        public string SomeValue { get; set; }
    }
}

Чтобы было ясней, что есть что, добавлю appsettings

{
  "MySettings": {
    "SomeValue": "🤓",
  }
}

Ну и затем в файле Program:

builder.Configuration.GetSection(ApplicationServicesSettings.MySettings).Bind(ApplicationServicesSettings.MyClassValue);

Ну и чтоб вызвать:

string someValue = ApplicationServicesSettings.MyClassValue.SomeValue;

Что касается самого файла, я просто создала файл с соответствующей средой названия. Release

Если Вы обратите внимание красный кружок рядом с файлом appsettings он говорит о том, что файл я не загружаю при коммитах (github, devAzure и т.д.), для этого я просто добавила gitignore при создании проекта на платформе и в конце файла добавила строчку.

# Remove developpement configuration files
**/appsettings.*.json

а тут тоже много интересного и тут,

Покажите на внятном примере, как вы настройки куда пишете, чтоб после публикации находилось все и работало.

Ответы

▲ 3Принят

Для удобства разработки существует механизм разделения конфигурационного файла на несколько частей:

  • Общая - appsettings.json (можно задать все настройки приложения тут)
  • Зависимая - appsettings.{name}.json (можно переопределить настройки из общей части или добавить новые)

Имя зависимой части - {name} может задаваться в переменной окружения (например в DOTNET_ENVIRONMENT=Development) или даже переопределяться самим приложением

Основные виды окружений:

  • Development - запуск приложения в среде разработки или тестирования
  • Staging - запуск приложения в среде приближенном к продуктовом (аналог закрытой беты)
  • Production - запуск в продуктовой среде

Всё это условности и можно добавлять любые свои окружения, например:

  • Testing - окружение для интеграционных или юнит тестов
  • Local - локальное окружение (запуск на машине разработчика в режиме debug например)

И конечно всё это просто базовые настройки, которые вы можете поменять под себя. Например загружать конфигурацию из базы, etcd, zookeeper из переменных окружения, из командной строки запуска самого приложения, из xml файла или yaml

Отвечая на ваш вопрос. Не надо ничего копировать после публикации. Один раз перенесите все общие настройки из appsettings.Development.json в appsettings.json, а частные (например строка подключения к БД) оставте.

▲ 2

источник

Мне понравилось решение, оставлю здесь, переведу ответ как есть в источнике

Для .NET 6 я нашел это лучшим решением:

var webAppOptions = new WebApplicationOptions()
{   
    Args = args,

    #if DEBUG
        EnvironmentName = Environments.Development,
    #else
        EnvironmentName = Environments.Production,
    #endif

};

var builder = WebApplication.CreateBuilder(webAppOptions);

Мы также можем прочитать EnvironmentName из файла конфигурации и установить его WebApplicationOptions перед вызовом WebApplication.CreateBuilder

Теперь мы также можем протестировать производственную среду на нашей машине разработки. Нам просто нужно переключиться на release сборку, и у нас есть производственная среда.

Нет необходимости устанавливать какие-либо переменные ОКРУЖАЮЩЕЙ СРЕДЫ.

Преимущество такого подхода также в том, что мы не можем случайно создать сборку релиза, работающую в Development среде.

пример на гитхаб https://github.com/Dev18000/ExampleAppsettings/blob/master/ExampleAppsettings/Program.cs