[c#] asp.net 코어의 개발 및 릴리스 환경에 대해 appsettings.json을 자동으로 설정 하시겠습니까?

appsettings.json개발, 스테이징 및 라이브 환경에 대해 다른 데이터베이스 연결 문자열, webapi 위치 등과 같은 항목에 대해 몇 가지 값을 정의했습니다 .

여러 appsettings.json파일 (예 appsettings.live.json: 등)을 보유하고 asp.net 앱이 실행중인 빌드 구성에 따라 사용할 파일을 ‘알게’하는 방법이 있습니까?



답변

조건부 컴파일을 사용할 수 있습니다.

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
#if SOME_BUILD_FLAG_A
    .AddJsonFile($"appsettings.flag_a.json", optional: true)
#else
    .AddJsonFile($"appsettings.no_flag_a.json", optional: true)
#endif
    .AddEnvironmentVariables();
    this.configuration = builder.Build();
}


답변

작업 환경의 스크린 샷을 추가했습니다. 몇 시간의 연구 개발 비용이 들었 기 때문입니다.

  1. 먼저 launch.json파일에 키를 추가 하십시오.

    아래 스크린 샷을 참조하여 Development내 환경으로 추가 했습니다.

    launch.json의 환경 변수 선언

  2. 그런 다음 프로젝트 appsettings.{environment}.json에서 환경 이름이 포함 된 새 파일을 만듭니다 .

    다음 스크린 샷에서 이름이있는 두 개의 다른 파일을 찾습니다.

    • appsettings.Development.Json
    • appSetting.json

    appsettings JSON 파일의 프로젝트보기

  3. 마지막으로 다음 StartUp과 같이 클래스에 구성하십시오 .

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();
    
        Configuration = builder.Build();
    }
    
  4. 마지막으로 다음과 같이 명령 줄에서 실행할 수 있습니다.

    dotnet run --environment "Development"
    

    "Development"내 환경의 이름은 어디에 있습니까 ?


답변

.NET Core 3.0 이상용 업데이트

  1. CreateDefaultBuilder구성 개체를 자동으로 빌드하고 시작 클래스에 전달할 수있는 방법을 사용할 수 있습니다 .

    WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
    
    public class Startup
    {
        public Startup(IConfiguration configuration) // automatically injected
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }
        /* ... */
    }
    
  2. CreateDefaultBuilder자동으로 적절한 파일을 포함 하므로 각 환경에 대해 별도의 appsettings 파일을 추가하십시오.appsettings.Environment.json

    appsettings.env.json

  3. 그런 다음 실행 / 디버깅시 ASPNETCORE_ENVIRONMENT 환경 변수를 설정하십시오.

환경 변수 설정 방법

IDE에 따라 dotnet 프로젝트는 일반적으로 환경 변수를 찾는 몇 가지 위치가 있습니다.

  • 들어 비주얼 스튜디오 프로젝트> 속성> 디버그> 환경 변수로 이동 :

    Visual Studio-환경 변수

  • 대한 비주얼 스튜디오 코드 편집 .vscode/launch.json> env:

    Visual Studio Code> 시작 환경

  • 시작 설정을 사용하여 편집하십시오.Properties/launchSettings.json > environmentVariables:

    시작 설정

    Visual Studio의 도구 모음에서도 선택할 수 있습니다.

    시작 설정 드롭 다운

  • dotnet CLI 사용 위한 적절한 구문을 사용 하여 OS에 따라 환경 변수를 설정

    참고 : 응용 프로그램이 함께 실행되면 DOTNET 실행 , launchSettings.json사용 가능한 경우 읽고있다environmentVariables launchSettings.json 재정의 환경 변수의 설정.

어떻게 Host.CreateDefaultBuilder작동합니까?

.NET Core 3.0 은 다음 순서로 앱에 대한 기본 구성을 Host.CreateDefaultBuilder제공하는 기본 초기화를 제공하는 플랫폼 확장 아래에 추가되었습니다 IConfiguration.

  1. appsettings.json 사용하여 JSON 구성 공급자를 .
  2. appsettings.Environment.json 사용하여 JSON 구성 공급자를 . 예를 들면 :
    • appsettings.Production.json 또는
    • appsettings.Development.json
  3. 앱 비밀 이 개발 환경에서 실행될 때 .
  4. 다음을 사용하는 환경 변수 구성 공급자를 환경 변수 .
  5. 명령 줄 구성 공급자를 사용하는 명령 줄 인수 .

추가 자료-MS Docs


답변

ASP.NET Core에서는 적절한 appsettings.json을위한 빌드 구성 대신 환경 변수를 사용해야합니다.

  1. 프로젝트> 속성> 디버그> 환경 변수를 마우스 오른쪽 버튼으로 클릭합니다.

    환경 변수

  2. ASP.NET Core는 적절한 appsettings.json 파일을 사용합니다.

    솔루션 탐색기의 appsettings 파일 예

  3. 이제 다음과 같이 해당 환경 변수를 사용할 수 있습니다.

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();
    
        Configuration = builder.Build();
    }
    

참고 : @Dmitry의 답변 을 사용 하면 예를 들어 문제가 발생할 수 있습니다. Azure에서 appsettings.json 값을 재정의 할 때 .


답변

ConfigurationBuilder다음 Startup과 같이 생성자 의 환경 변수와 클래스를 사용할 수 있습니다 .

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
    .AddEnvironmentVariables();
    this.configuration = builder.Build();
}

그런 다음 appsettings.xxx.json“xxx”가 환경 이름 인 필요한 모든 환경에 대한 파일을 만듭니다 . 모든 글로벌 구성 값을 “일반”에 넣을 수 있습니다.appsettings.json 파일에 넣을 수 있고 환경 특정 항목 만 이러한 새 파일에 넣을 수 있습니다.

이제 ASPNETCORE_ENVIRONMENT특정 환경 값 ( “live”, “staging”, “production”등)으로 호출되는 환경 변수 만 필요합니다 . 개발 환경의 프로젝트 설정에서이 변수를 지정할 수 있으며, 물론 스테이징 및 프로덕션 환경에서도 설정해야합니다. 거기에서하는 방법은 이것이 어떤 종류의 환경인지에 달려 있습니다.

업데이트 : 방금 appsettings.xxx.json현재 빌드 구성을 기반으로 선택하고 싶다는 것을 깨달았습니다 . 이것은 제안 된 솔루션으로는 달성 할 수 없으며이를 수행 할 방법이 있는지 모르겠습니다. 그러나 “환경 변수”방식은 작동하며 귀하의 접근 방식에 대한 좋은 대안이 될 수 있습니다.


답변

.NET core 2.0 사용자를위한 업데이트 일 뿐이므로 다음을 호출 한 후 응용 프로그램 구성을 지정할 수 있습니다 CreateDefaultBuilder.

public class Program
{
   public static void Main(string[] args)
   {
      BuildWebHost(args).Run();
   }

   public static IWebHost BuildWebHost(string[] args) =>
      WebHost.CreateDefaultBuilder(args)
             .ConfigureAppConfiguration(ConfigConfiguration)
             .UseStartup<Startup>()
             .Build();

   static void ConfigConfiguration(WebHostBuilderContext ctx, IConfigurationBuilder config)
   {
            config.SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("config.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"config.{ctx.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);

   }
 }


답변

  1. 다음 과 같은 여러 파일을 만듭니다 .appSettings.$(Configuration).json

    • appSettings.staging.json
    • appSettings.production.json
  2. 프로젝트에서 각 파일을 appSettings.json다음 위치에 복사하는 사전 빌드 이벤트를 만듭니다 .

    copy appSettings.$(Configuration).json appSettings.json
    
  3. appSettings.jsonConfig Builder 에서만 사용하십시오 .

    var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables();
    
    Configuration = builder.Build();