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


105

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

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

답변:


31

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

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();
}

29
MSBuild / TFS 빌드에서 환경 변수를 설정해야합니다. 조건부 컴파일은 CI 빌드에서 쉽게 처리 할 수있는 실수로 이어집니다. 즉, .AddJsonFile ($ "appsettings. {env.EnvironmentName} .json", 선택 사항 : true)
Nick Turner

1
환경 변수에 대한 내 대답 ( stackoverflow.com/a/50331886/1319086 ) 참조
Jonatan Dragon

10
이러한 접근 방식은 코드를 각 환경에 맞게 특별히 재 컴파일해야하므로 다른 곳에서 재배포 / 설치할 수 없습니다.
tvdias

2
질문은 "빌드 구성에 대해 아는 것"에 관한 것이 었습니다
Dmitry

6
이것은 허용 된 답변으로 표시되어서는 안됩니다. 솔루션이기는하지만 모범 사례는 아닙니다.
Charleh

98

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

  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"내 환경의 이름은 어디에 있습니까 ?


2
이것을 시도하고 훌륭하게 작동합니다. VS2017은 기본 파일 아래에 다른 버전도 표시합니다. 투표.
Roberto

1
당신은 ihostingenvironment가 deprected대로 코어 2.2에 그것을 어떻게
djack109

2
@ djack109 IWebHostEnvironment대신 사용해야 합니다.
alessandrocb

71

.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


감사합니다. 좋지만 콘솔 프로세스 (또는 작업자 프로세스 템플릿 / 스캐 폴딩)로 어떻게 할 수 있습니까?
hB0

이것은 최신 버전에서는 작동하지 않으며 항상 appsettings.json을 사용하고 appsettings.development.json을 무시합니다. 실행 (dev) 및 실행 (prod)도 누락되었습니다.
user1034912 dec.

45

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 값을 재정의 할 때 .


35

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현재 빌드 구성을 기반으로 선택하고 싶다는 것을 깨달았습니다 . 이것은 제안 된 솔루션으로는 달성 할 수 없으며이를 수행 할 방법이 있는지 모르겠습니다. 그러나 "환경 변수"방식은 작동하며 귀하의 접근 방식에 대한 좋은 대안이 될 수 있습니다.


프로젝트 속성-> 디버그 섹션에서 환경 변수 사용을 살펴 보았지만 프로젝트 설정에 따라 이것이 어떻게 변경되는지 분명한 방법은 없습니다. 내 프로젝트에 추가하여 처리 할 수있는 다른 파일입니까?
meds

프로젝트 속성 내에서 변수를 설정하는 것은 개발 환경 (아마 Visual Studio)에서 사용하는 경우에만 작동합니다. 특정 환경 (IIS, Azure)에 따라 배포 된 앱에 대해 다른 곳에서 설정해야합니다. 이 파일도 배포 된 다음 서버 값을 재정의 할 수 있으므로 일부 구성 파일에서 변수를 설정하지 않는 것이 좋습니다.
Onkel Toob

빌드 구성에서 설정합니다. 다음 빌드 구성 파일이없는 경우 그들은 (구식)에 그것을 설정 배포 프로필을 필요 그래서 그들은 수동으로하고있다
닉 터너

Azure에 테스트, 준비 및 프로덕션과 같은 여러 환경이 있습니다. 웹앱의 릴리스 빌드를 VS에서 Azure로 게시하려는 경우 ASPNETCORE_ENVIRONMENT 변수를 어디에서 변경합니까?
서리가 내린

배포 중에 변수를 변경하지 않고 대신 특정 환경에 기본 제공됩니다. Azure에서는 "응용 프로그램 설정"에서 앱 서비스 구성 내에서 이러한 값을 직접 설정할 수 있습니다. 여러 슬롯으로 작업하는 경우 "배포 슬롯 설정"으로 표시하는 것을 잊지 마십시오.
Onkel Toob

29

.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);

   }
 }

2
사용중인 환경을 어떻게 전환합니까? 구성 파일에서 변경해야하는 사항이 있습니까? 나는에 푸른에 프로젝트를 실행하면 내가 사용하고 싶은 URL을 추가해야 이해 appsettings.json 과 URL 내가 (F5에 의해) 로컬로 실행시에 실행하려는 appsettings.Development.json . 그 맞습니까? 내가 사용하려는 문자열은 launchSettings.json 파일 에 있으며 응용 프로그램이 실행되는 위치 (또는 변경되어야하는 경우)에 따라 변경하는 방법에 대해 약간 불분명합니다.
DonkeyBanana

3
@DonkeyBanana 환경은 프로젝트 속성에 지정된 설정에 지나지 않습니다. VS 2017에서 프로젝트> 속성을 ​​마우스 오른쪽 버튼으로 클릭합니다. 디버그에서 key의 현재 환경을 볼 수 있습니다 ASPNETCORE_ENVIRONMENT. 값은에서 대체 될 것입니다 ctx.HostingEnvironment.EnvironmentName}. 따라서 속성의 해당 값을 'Production'으로 설정하면 프로젝트가 config.Production.json루트 폴더에서 파일을 찾습니다 . 자세한 정보는이 링크
umutesen

를 작성 Error CS0266 Cannot implicitly convert type 'Microsoft.AspNetCore.Hosting.IWebHost' to 'Microsoft.AspNetCore.Hosting.IWebHostBuilder'. An explicit conversion exists (are you missing a cast?) ... WebHost.CreateDefaultBuiler (에
Hecatonchires

있다는 지적이의 가치가 여기에 이 상태가 "당신이 CreateDefaultBuilder와 새 호스트 빌더를 초기화 할 때 AddJsonFile가 자동으로 두 번 호출됩니다". 그것은 이미 환경 구성에 따라 다음 appSettings.json 및로드 즉,로드 appSettings는이다 {환경} .json.
데이비드 예이츠

최신 Visual Studio에서 @umutsen 더 이상 실행 환경 설정이
user1034912을

13
  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();
    

이것은 허용되는 대답이어야합니다. 복잡한 경우에는 SlowCheetah를 사용할 수 있습니다.
Anton Krouglov

8

당신은으로 구성 이름을 추가 할 수 있습니다 ASPNETCORE_ENVIRONMENTlaunchSettings.json아래와 같이

  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:58446/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "environmentVariables": {
        ASPNETCORE_ENVIRONMENT": "$(Configuration)"
      }
    }
  }

3

웹 페이지없이 콘솔 앱을 사용할 때 저에게 맞는 버전입니다.

var builder = new ConfigurationBuilder()
             .SetBasePath(Directory.GetCurrentDirectory())
             .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
             .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true);

            IConfigurationRoot configuration = builder.Build();
            AppSettings appSettings = new AppSettings();
            configuration.GetSection("AppSettings").Bind(appSettings);

0

.vscode / launch.json 파일은 Visual Studio 및 /Properties/launchSettings.json 파일에서만 사용됩니다. 프로덕션에서 이러한 파일을 사용하지 마십시오.

launchSettings.json 파일 :

  1. 로컬 개발 머신에서만 사용됩니다.
  2. 배포되지 않습니다.
  3. 프로필 설정이 포함되어 있습니다.

    • launchSettings.json에 설정된 환경 값은 시스템 환경에 설정된 값을 재정의합니다.

예를 들어 'appSettings.QA.json'파일을 사용하려면 'ASPNETCORE_ENVIRONMENT'를 사용할 수 있습니다. 아래 단계를 따르십시오.

  1. 호스트 컴퓨터에 새 환경 변수를 추가하고 이름을 'ASPNETCORE_ENVIRONMENT'로 지정합니다. 값을 'QA'로 설정합니다.
  2. 프로젝트에 'appSettings.QA.json'파일을 만듭니다. 여기에 구성을 추가하십시오.
  3. 1 단계에서 머신에 배포합니다. 'appSettings.QA.json'이 배포되었는지 확인합니다.
  4. 웹 사이트를로드합니다. 여기에서 appSettings.QA.json이 사용될 것으로 예상합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.