ASPNETCORE_ENVIRONMENT를 asp.net 핵심 응용 프로그램 게시에 고려하도록 설정하는 방법은 무엇입니까?


109

내 asp.net 핵심 웹 응용 프로그램을 로컬 파일 시스템에 게시 할 때 항상 값이 "Production"인 production-config 및 ASPNETCORE_ENVIRONMENT 변수를 사용합니다.

디버깅뿐만 아니라 게시에도 고려되도록 ASPNETCORE_ENVIRONMENT 변수의 값을 어떻게 그리고 어디에 설정해야 합니까? 나는 이미 성공하지 않고 다음 옵션을 시도했습니다.

  • Windows 설정에서
  • .pubxml 파일
  • launchSettings.json에서
  • project.json에서

3
당신은 공식 문서를 읽어 마십시오 docs.microsoft.com/en-us/aspnet/core/fundamentals/environments 또는이 튜토리얼 andrewlock.net/...를 ?
J. Doe


1
stackoverflow.com/questions/43493259/… 실제 오류를 확인하는 두 가지 옵션이 있습니다.
Kurkula

답변:


90

위에서 언급 한 옵션 외에 몇 가지 다른 솔루션이 있습니다.

1. 프로젝트 파일 (.CsProj) 파일 수정

MSBuild는 EnvironmentName배포하려는 환경에 따라 올바른 환경 변수를 설정하는 데 도움이 될 수 있는 속성을 지원합니다 . 환경 이름은 게시 단계 중에 web.config에 추가됩니다.

프로젝트 파일 (* .csProj)을 열고 다음 XML을 추가하기 만하면됩니다.

<!-- Custom Property Group added to add the Environment name during publish
  The EnvironmentName property is used during the publish for the Environment variable in web.config
  -->
  <PropertyGroup Condition=" '$(Configuration)' == '' Or '$(Configuration)' == 'Debug'">
    <EnvironmentName>Development</EnvironmentName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' != '' AND '$(Configuration)' != 'Debug' ">
    <EnvironmentName>Production</EnvironmentName>
  </PropertyGroup>

위의 코드는 Development디버그 구성 또는 구성이 지정되지 않은 경우 환경 이름을 추가 합니다. 다른 구성의 경우 환경 이름은 Production생성 된 web.config 파일에 있습니다. 자세한 내용은 여기

2. 게시 프로필에 EnvironmentName 속성을 추가합니다.

<EnvironmentName>게시 프로필에도 속성을 추가 할 수 있습니다 . Properties/PublishProfiles/{profilename.pubxml}프로젝트가 게시 될 때 web.config에 환경 이름이 설정됩니다. 에있는 게시 프로필 파일을 엽니 다 . 여기에 자세한 내용

<PropertyGroup>
  <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>

3. dotnet publish를 사용하는 명령 줄 옵션

추가로, 속성 EnvironmentName을 명령 줄 옵션으로 명령에 전달할 수 있습니다 dotnet publish. 다음 명령은 Developmentweb.config 파일에있는 환경 변수를 포함 합니다.

dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development


7
내가 말할 수있는 한 이것이 최선의 대답 인 것 같습니다. 게시 프로필별로 설정하는 기능은 정말 많은 도움이되었습니다.
Jonathan Quinth

세 번째 옵션은 저에게 효과적입니다. / p : EnvironmentName 옵션이 dotnet 설명서의 어느 곳에서나 언급되는지 알고 있습니까?
rasyadi

8
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development내가 찾던 바로 그것입니다. 감사!
Matt M

누군가가 UAT, QA 또는 프로덕션에 게시하려는 경우 완전한 'dotnet 게시 ....'가 무엇인지 말씀해 주시겠습니까?
crazyTech

75

옵션 1:

Windows에서 ASPNETCORE_ENVIRONMENT 환경 변수를 설정하려면

명령 줄- setx ASPNETCORE_ENVIRONMENT "Development"

PowerShell- $Env:ASPNETCORE_ENVIRONMENT = "Development"

다른 OS의 경우 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments를 참조 하십시오.

Option2 :

ASPNETCORE_ENVIRONMENT를 사용하여 설정하려면 web.config다음 aspNetCore과 같이 추가하십시오 .

<configuration>
  <!--
    Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380
  -->
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath=".\MyApplication.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

43
이 두 가지 모두 끔찍한 옵션입니다. 1) 전체 OS에 대해 설정합니다. IIS에서 사이트별로 설정하고 싶습니다. 2) AspNet Core는 web.config 변환을 지원하지 않습니다. web.config가 배포를 위해 수정되는 것을 어떻게 제안합니까?
Kugel

여기에서 공식 문서를 참조하십시오 -docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module
Sanket

5
더 나은 옵션을
찾았

5
이러한 종류의 구성 디자인은 매우 복잡해 보입니다.
koo9

2
여러 환경의 게시 프로필에서이를 재정의 할 수 있습니다.
cederlof

31

Visual Studio IDE에서 설정하는 간단한 방법입니다.

프로젝트> 속성> 디버그> 환경 변수

여기에 이미지 설명 입력


3
그러나 다른 환경에 게시해야 할 때마다이를 변경하는 것을 기억해야합니다.
Alisson

15
정답이 아닙니다. IDE를 실행할 때만 작동합니다. Visual Studio 사물 인 launchsettings.json 파일에 저장합니다. 배포에는 작동하지 않습니다.
onefootswill

21

사용 하여 설명서에 제공된 지침을 따라야 합니다 web.config.

<aspNetCore processPath="dotnet"
        arguments=".\MyApp.dll"
        stdoutLogEnabled="false"
        stdoutLogFile="\\?\%home%\LogFiles\aspnetcore-stdout">
  <environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
    <environmentVariable name="CONFIG_DIR" value="f:\application_config" />
  </environmentVariables>
</aspNetCore>

다른 환경 변수도 설정할 수 있습니다.

ASP.NET Core 모듈을 사용하면 aspNetCore 요소 아래에있는 environmentVariables 컬렉션 요소의 하나 이상의 environmentVariable 자식 요소에 지정하여 processPath 특성에 지정된 프로세스에 대한 환경 변수를 지정할 수 있습니다. 이 섹션에서 설정 한 환경 변수는 프로세스의 시스템 환경 변수보다 우선합니다.


.net 코어 콘솔 앱에서 어떻게 설정합니까?
user441365 dec.

Windows의 환경 변수 대화 상자를 통해 설정하십시오.
David Pine

1
그러나 OS가 아닌 프로젝트에서 설정하는 방법이 있습니까?
user441365 dec.

아니 나는의 ... 아니 알고 있어요 것을 .NET 코어에서 콘솔 애플 리케이션을위한 - 어쩌면이 - stackoverflow.com/a/46445432/2410379 ?
David Pine

15

이것이 우리가 런타임에서 설정하는 방법입니다.

public class Program
{
    public static void Main(string[] args)
    {
        Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");

        BuildWebHost(args).Run();
    }

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

왜 이것이 반대표를 받았는지 확실하지 않습니다. 나에게 도움이 된 유일한 것이기 때문입니다.
pcalkins

1
코드에 하드 코딩 된 값으로 인해 하향 투표되었을 가능성이 큽니다.
Kevin C.

테스트는 가장 빠르지 만 장기적으로 체크인 코드로보고 싶은 것은 동의하지 않습니다.
Brett Rigby

이것은 하드 코딩되어 있지만 이것이 가장 쉬운 방법이라고 생각합니다.
가는 - 사라

1
내가 선호하는 방법은 DEBUG와 함께 사용하여 올바른 값을 설정합니다.
Dave de Jong

6

최신 버전의 dotnet cli (2.1.400 이상)에서는이 msbuild 속성을 설정하기 만하면 $(EnvironmentName)게시 도구가 환경 이름을 사용하여 web.config에 ASPNETCORE_ENVIRONMENT를 추가하는 작업을 처리합니다.

또한 XDT 지원은 2.2.100-preview1부터 사용할 수 있습니다.

샘플 : https://github.com/vijayrkn/webconfigtransform/blob/master/README.md


7
자세히 설명 you can just set this msbuild property $(EnvironmentName) and publish하거나 참조를 제공 할 수 있습니까?
DanElliott

1
.net 코어 콘솔 앱에서 어떻게 설정합니까?
user441365 dec.

6
  1. appsettings. *. json 파일을 만듭니다. (예 : appsettings.Development.json, appsettings.Staging.json, appsettings.Production.json)

  2. 해당 파일에 변수를 추가하십시오.

  3. 평소처럼 각 환경에 대해 별도의 게시 프로필을 만듭니다.

  4. PublishProfiles / Development.pubxml을 엽니 다 (이름은 게시 프로필의 이름을 기반으로 함).

  5. PublishProfile 에 태그를 추가 하여 EnvironmentName 변수 를 설정 하기 만하면 appsettings. *. json 파일 명명 규칙이 나머지 작업을 수행합니다.

    <PropertyGroup>
      <EnvironmentName>Development</EnvironmentName>
    </PropertyGroup>

참조 : https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-3.1

"환경 설정"섹션을 참조하십시오.


3

이 변수는 json에 저장할 수 있습니다. 예를 들어 다음과 같은 내용이있는 envsettings.json

  {
   // Possible string values reported below. When empty it use ENV variable value or 
     // Visual Studio setting.
     // - Production
     // - Staging
     // - Test
     // - Development

   "ASPNETCORE_ENVIRONMENT": "Development"
  }

나중에 program.cs를 아래와 같이 수정하십시오.

  public class Program
  {
    public static IConfiguration Configuration { get; set; }
    public static void Main(string[] args)
    {
        var currentDirectoryPath = Directory.GetCurrentDirectory();
        var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json");
        var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath));
        var environmentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();

        var builder = new ConfigurationBuilder()
               .SetBasePath(Directory.GetCurrentDirectory())
               .AddJsonFile("appsettings.json");

        Configuration = builder.Build();
          var webHostBuilder = new WebHostBuilder()
            .UseKestrel()
            .CaptureStartupErrors(true)
            .UseContentRoot(currentDirectoryPath)
            .UseIISIntegration()
            .UseStartup<Startup>();

        // If none is set it use Operative System hosting enviroment
        if (!string.IsNullOrWhiteSpace(environmentValue))
        {
            webHostBuilder.UseEnvironment(environmentValue);
        }

        var host = webHostBuilder.Build();

        host.Run();
     }
 }

이렇게하면 항상 게시에 포함되며 웹 사이트가 호스팅되는 환경에 따라 필요한 값으로 변경할 수 있습니다. 이 방법은 Program.cs에 변경 사항이 있으므로 콘솔 앱에서도 사용할 수 있습니다.


0

이 변수를 Azure platorm (사용하는 경우)에서 직접 설정하여 저에게 효과적이라는 것을 알았습니다. 웹앱-> 구성-> 애플리케이션 설정을 선택하고 변수와 해당 값을 추가 한 다음 저장 버튼을 누릅니다.


0

사이트별로 환경을 설정할 수 있도록 프로젝트에서 사용하는 다른 옵션은 다음 내용으로 프로젝트에 Parameters.xml 파일을 추가하는 것입니다.

<parameters>
      <parameter name="IIS Web Application Name" defaultValue="MyApp" tags="IisApp" />    
      <parameter name="Environment" description="Environment" tags="">
        <parameterEntry kind="XmlFile" scope="Web.config"  match="/configuration/location/system.webServer/aspNetCore/environmentVariables/environmentVariable[@name='ASPNETCORE_ENVIRONMENT']/@value" />
      </parameter>    
</parameters>

이 파일에 대한 빌드 작업은 콘텐츠 이고 복사 작업은 최신 버전 인 경우 복사 이므로 배포 할 패키지의 일부가됩니다.

그런 다음 패키지를 배포하고 환경을 설정하기 위해 릴리스의 "WinRM-IIS 웹 앱 배포"작업 ( "IIS 웹 앱 배포"작업을 사용할 때와 동일하게 작동) 아래에 msdeploy에 대한 추가 인수를 설정합니다. :

-setParam:kind=ProviderPath,scope=contentPath,value="MySite" -setParam:name="Environment",value="Stage"

이렇게하면 모두 동일한 아티팩트를 사용하지만 다른 환경으로 배포되는 여러 릴리스를 가질 수 있습니다.


0

나는 이것이 오래된 게시물이라는 것을 알고 있지만 아무도 제안하지 않았기 때문에 내 간단한 솔루션을 믹스에 던질 것이라고 생각했습니다.

현재 디렉터리를 사용하여 현재 환경을 확인한 다음 연결 문자열과 환경 변수를 뒤집습니다. 이것은 test / beta / sandbox와 같은 사이트 폴더에 대한 명명 규칙이있는 한 훌륭하게 작동합니다.

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var dir = Environment.CurrentDirectory;
        string connectionString;

        if (dir.Contains("test", StringComparison.OrdinalIgnoreCase))
        {
            connectionString = new ConnectionStringBuilder(server: "xxx", database: "xxx").ConnectionString;
            Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");
        }
        else
        {
            connectionString = new ConnectionStringBuilder(server: "xxx", database: "xxx").ConnectionString;
            Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Production");
        }

        optionsBuilder.UseSqlServer(connectionString);
        optionsBuilder.UseLazyLoadingProxies();
        optionsBuilder.EnableSensitiveDataLogging();
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.