【问题标题】:How to set ASPNETCORE_ENVIRONMENT during publishing?发布时如何设置 ASPNETCORE_ENVIRONMENT?
【发布时间】:2019-08-25 13:10:02
【问题描述】:

我有几个 WebDeploy 发布配置文件,它们将我的 .NET Core Web 项目部署到不同的地方(Dev、QA、IIS 上的 Stage)。为了让应用程序知道它在哪里运行,我需要设置 ASPNETCORE_ENVIRONMENT 环境变量。

是否可以将 ASPNETCORE_ENVIRONMENT 环境变量设置为发布应用程序的一部分?

附: This question 没有为我解决任何问题,因为它展示了如何手动实现它。我希望它作为部署发布配置文件的一部分是自动的。

【问题讨论】:

标签: asp.net-core asp.net-core-mvc


【解决方案1】:

您可以在 部分使用以下文本更新您的 webconfig 文件。

<configuration>
  <system.webServer>
    <aspNetCore .....>
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

或者您可以在 IIS 中托管您的应用程序后按照以下步骤操作。

第 1 步: 点击配置编辑器,如下图所示

第 2 步:

现在选择 system.webserver/asp.netcore 并在其他下拉列表中选择 applicationHost.config,如下图所示。

第 3 步:

现在选择 enviromentVariable 并输入值。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    来自https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-3.1#set-the-environment

    对于 Windows IIS 部署:在发布配置文件 (.pubxml) 或项目文件中包含该属性。这种方法在项目发布时在 web.config 中设置环境。

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

    【讨论】:

    • 我这样做了,希望将应用程序更改发布到生产环境,但在我这样做后应用程序无法加载。错误只是说“启动应用程序时发生错误”。不知道为什么它不起作用。
    【解决方案3】:

    我无意中找到了 OP 问题的简单答案。

    如果在您调用dotnet publish 时设置了名为environmentName 的环境变量,它将把它合并到您的web.config 中。

    Azure App Service - What modified my web.config?

    【讨论】:

      【解决方案4】:

      经过长时间的搜索、阅读和实验,我只需在我的.pubxml 中添加环境变量ASPNETCORE_ENVIRONMENT 即可解决

      <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
          <ASPNETCORE_ENVIRONMENT>Test</ASPNETCORE_ENVIRONMENT>
        </PropertyGroup>
        <PropertyGroup>
          <WebPublishMethod>MSDeploy</WebPublishMethod>
          <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
          <LastUsedPlatform>Any CPU</LastUsedPlatform>
          .....
        </PropertyGroup>
      </Project>
      

      我用它来选择我的 react 应用的构建环境,在发布时,我的 .csproj 看起来像:

        <Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
          <Exec WorkingDirectory="$(SpaRoot)" Command="npm install" />
          <Exec WorkingDirectory="$(SpaRoot)" Command="npm run build:$(ASPNETCORE_ENVIRONMENT.ToLower())" />
          ...
        </Target>
      

      最后是我的 react 应用的package.json

      "scripts": {
          "start": "env-cmd -f .env.development react-scripts start",
          "build:production": "env-cmd -f .env.production react-scripts build",
          "build:staging": "env-cmd -f .env.staging react-scripts build",
          "build:test": "env-cmd -f .env.test react-scripts build",
          "test": "react-scripts test",
          "eject": "react-scripts eject",
          "mock:api": "json-server --watch db.json --port 4000"
        },
      

      我故意删除了"build": "react-scripts build" 行,所以总是提供环境。

      编辑:

      我还添加了PropertyGroup 用于在.csproj 文件中设置EnvironmentName,所以在发布时,我的web.config 会将ASPNETCORE_ENVIRONMENT 设置为环境变量,正如我的.pubxml 中定义的那样,动态地:

        <Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
          <Exec WorkingDirectory="$(SpaRoot)" Command="npm install" />
          <Exec WorkingDirectory="$(SpaRoot)" Command="npm run build:$(ASPNETCORE_ENVIRONMENT.ToLower())" />
          <PropertyGroup>
            <EnvironmentName>$(ASPNETCORE_ENVIRONMENT)</EnvironmentName>
          </PropertyGroup>
        </Target>
      

      【讨论】:

        【解决方案5】:

        要在特定环境下发布web.config,您可以尝试Transform web.config

        根据您的要求,您可以尝试Profile

        1. 使用不同的ASPNETCORE_ENVIRONMENT 环境变量创建多个 web.{profile}.config。

          例如web.Dev.config

          <?xml version="1.0" encoding="utf-8"?>
          <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
          <location>
              <system.webServer>
              <aspNetCore>
                  <environmentVariables xdt:Transform="InsertIfMissing">
                  <environmentVariable name="ASPNETCORE_ENVIRONMENT"
                                      value="Dev"
                                      xdt:Locator="Match(name)"
                                      xdt:Transform="InsertIfMissing" />
                  </environmentVariables>
              </aspNetCore>
              </system.webServer>
          </location>
          </configuration>
          

          例如。 web.Release.config

          <?xml version="1.0" encoding="utf-8"?>
          <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
          <location>
              <system.webServer>
              <aspNetCore>
                  <environmentVariables xdt:Transform="InsertIfMissing">
                  <environmentVariable name="ASPNETCORE_ENVIRONMENT"
                              value="Release"
                              xdt:Locator="Match(name)"
                              xdt:Transform="InsertIfMissing" />
                  </environmentVariables>
              </aspNetCore>
              </system.webServer>
          </location>
          </configuration>
          
        2. 使用特定名称(如 DevRelease)创建项目配置文件,您可以使用现有配置文件名称创建 web.{profile}.config。

        3. 发布后会将web.{profile}.config的具体内容复制到web.config中

        4. 目前,它会在您的 publihshed 文件夹中存在 web.configweb.Dev.configweb.Release.config,如果您只喜欢 web.config,请更改您的 Project.csproj,如下所示以排除不需要的文件。

          <Project Sdk="Microsoft.NET.Sdk.Web">
          
          <PropertyGroup>
              <TargetFramework>netcoreapp2.2</TargetFramework>
              <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
              <Configurations>Debug;Release;Dev</Configurations>
          </PropertyGroup>
          
          <ItemGroup>
              <PackageReference Include="Microsoft.AspNetCore.App" />
              <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
          </ItemGroup>
          <ItemGroup>
              <Content Update="web.Dev.config" CopyToPublishDirectory="Never" />
              <Content Update="web.Release.config" CopyToPublishDirectory="Never" />
          </ItemGroup>
          </Project>
          

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多