[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();
}
답변
작업 환경의 스크린 샷을 추가했습니다. 몇 시간의 연구 개발 비용이 들었 기 때문입니다.
- 
먼저 launch.json파일에 키를 추가 하십시오.아래 스크린 샷을 참조하여 Development내 환경으로 추가 했습니다.
- 
그런 다음 프로젝트 appsettings.{environment}.json에서 환경 이름이 포함 된 새 파일을 만듭니다 .다음 스크린 샷에서 이름이있는 두 개의 다른 파일을 찾습니다. - appsettings.Development.Json
- appSetting.json
 
- 
마지막으로 다음 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(); }
- 
마지막으로 다음과 같이 명령 줄에서 실행할 수 있습니다. dotnet run --environment "Development""Development"내 환경의 이름은 어디에 있습니까 ?
답변
.NET Core 3.0 이상용 업데이트
- 
CreateDefaultBuilder구성 개체를 자동으로 빌드하고 시작 클래스에 전달할 수있는 방법을 사용할 수 있습니다 .WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();public class Startup { public Startup(IConfiguration configuration) // automatically injected { Configuration = configuration; } public IConfiguration Configuration { get; } /* ... */ }
- 
CreateDefaultBuilder자동으로 적절한 파일을 포함 하므로 각 환경에 대해 별도의 appsettings 파일을 추가하십시오.appsettings.Environment.json
- 
그런 다음 실행 / 디버깅시 ASPNETCORE_ENVIRONMENT환경 변수를 설정하십시오.
환경 변수 설정 방법
IDE에 따라 dotnet 프로젝트는 일반적으로 환경 변수를 찾는 몇 가지 위치가 있습니다.
- 
들어 비주얼 스튜디오 프로젝트> 속성> 디버그> 환경 변수로 이동 : 
- 
대한 비주얼 스튜디오 코드 편집 .vscode/launch.json>env:
- 
시작 설정을 사용하여 편집하십시오. Properties/launchSettings.json>environmentVariables:Visual Studio의 도구 모음에서도 선택할 수 있습니다. 
- 
dotnet CLI 사용 위한 적절한 구문을 사용 하여 OS에 따라 환경 변수를 설정 참고 : 응용 프로그램이 함께 실행되면 DOTNET 실행 , launchSettings.json사용 가능한 경우 읽고있다environmentVariableslaunchSettings.json 재정의 환경 변수의 설정.
어떻게 Host.CreateDefaultBuilder작동합니까?
.NET Core 3.0 은 다음 순서로 앱에 대한 기본 구성을 Host.CreateDefaultBuilder제공하는 기본 초기화를 제공하는 플랫폼 확장 아래에 추가되었습니다 IConfiguration.
appsettings.json사용하여 JSON 구성 공급자를 .
appsettings.Environment.json사용하여 JSON 구성 공급자를 . 예를 들면 :
appsettings.Production.json또는
appsettings.Development.json- 앱 비밀 이 개발 환경에서 실행될 때 .
- 다음을 사용하는 환경 변수 구성 공급자를 환경 변수 .
- 명령 줄 구성 공급자를 사용하는 명령 줄 인수 .
추가 자료-MS Docs
답변
ASP.NET Core에서는 적절한 appsettings.json을위한 빌드 구성 대신 환경 변수를 사용해야합니다.
- 
프로젝트> 속성> 디버그> 환경 변수를 마우스 오른쪽 버튼으로 클릭합니다. 
- 
ASP.NET Core는 적절한 appsettings.json 파일을 사용합니다. 
- 
이제 다음과 같이 해당 환경 변수를 사용할 수 있습니다. 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);
   }
 }
답변
- 
다음 과 같은 여러 파일을 만듭니다 . appSettings.$(Configuration).json- appSettings.staging.json
- appSettings.production.json
 
- 
프로젝트에서 각 파일을 appSettings.json다음 위치에 복사하는 사전 빌드 이벤트를 만듭니다 .copy appSettings.$(Configuration).json appSettings.json
- 
appSettings.jsonConfig Builder 에서만 사용하십시오 .var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); Configuration = builder.Build();









