如何在发布文件中设置aspnetcore_environment?

时间:2016-08-31 00:08:31

标签: configuration asp.net-core .net-core asp.net-core-1.0 coreclr

我有ASP.NET核心应用程序(Web Api)。该文档已解释working with multiple environments,但未能解释在发布网站时如何设置aspnetcore_environment

所以,假设我有3个环境DevelopmentStagingProduction

  1. 在经典的ASP.NET Web应用程序中,我用来创建3个构建配置。 DevelopmentStagingProduction(如下图所示)。然后是3个.pubxml个文件,每个配置一个。我是否也需要对ASP.NET Core应用程序使用相同的方法?

  2. 如何在aspnetcore_environment文件中设置.pubxml

  3. 如果问题1中指定的方法已经过时,那么替代方法是什么? (我使用Jenkins进行CI)

  4. enter image description here

    更新1

    我知道我必须设置ASPNETCORE_ENVIRONMENT但是我无法理解我们在哪里设置它?在开发过程中,我可以在launchSettings.json中的配置文件中进行设置,但问题是我们如何在发布到分段或生产时设置它?我们在目标服务器上设置环境变量吗?

    enter image description here

    更新2
    我发现文章here解释了设置环境变量的不同方法。这部分回答了我的问题。但是,当我发布应用程序时,发布过程在发布appsettings.{env.EnvironmentName}.json时不会遵循环境变量 我为该问题创建了单独的post

6 个答案:

答案 0 :(得分:16)

在IIS下托管应用程序时,您可以在web.config中设置环境变量。

https://docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module

要在发布时生成它,请将web.config添加到项目的根目录," dotnet publish"将使用此文件作为在publish文件夹中生成的文件的基础。然后,您可以更改部署系统中的值。

<?xml version="1.0" encoding="utf-8" ?>
<!-- Used to overwrite settings web.config generated by "dotnet publish", Only used when hosting under IIS -->
<configuration>
 <system.webServer>
   <aspNetCore stdoutLogEnabled="true">
     <environmentVariables>
       <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
     </environmentVariables>
   </aspNetCore>
 </system.webServer>  
</configuration>

答案 1 :(得分:11)

您可以使用以下命令将所需的ASPNETCORE_ENVIRONMENT作为参数传递到dotnet publish命令中:

/p:EnvironmentName=Staging

例如 dotnet publish /p:Configuration=Release /p:EnvironmentName=Staging

这将生成具有为项目指定的正确环境的web.config:

    <environmentVariables>
      <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
    </environmentVariables>

答案 2 :(得分:4)

我有相同的要求,因此提出了以下解决方案。这在自动部署中效果很好,并且所需的配置更改更少。

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>'$(Configuration)'</EnvironmentName>
  </PropertyGroup>

以上代码会将环境名称添加为Development,以进行空配置或Debug配置。对于任何其他配置,将从选择的配置中选择环境名称。这将为ASPNETCORE_ENVIRONMENT环境添加所需的配置。您可以通过更新CsProj文件来根据需要修改环境名称的逻辑。更多详细信息here

2。在发布配置文件中添加EnvironmentName属性。

我们也可以在发布配置文件中添加<EnvironmentName>属性。打开位于Properties/PublishProfiles/{profilename.pubxml}的发布配置文件,这将在发布项目时在web.config中设置环境名称。更多详细信息here

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

enter image description here

如上图所示,可以为每个配置添加环境,并且可以在每个* .pubxml文件中更改EnvironmentName属性的名称。

3。使用dotnet发布的命令行选项

此外,我们可以将属性EnvironmentName作为命令行选项传递给dotnet publish命令。以下命令将在web.config文件中将环境变量包括为Development

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

答案 3 :(得分:0)

我认为您无法在发布配置文件中执行此操作。你必须设置环境变量,例如ASPNETCORE_ENVIRONMENT =分期。 我不得不在Azure上使用aspnet核心Web应用程序做类似的事情。我想要开发,分期和制作。我这样做的方式与env变量完全相同。

答案 4 :(得分:0)

在visual studio IDE中设置它的简单方法。

项目&gt;性状&gt;调试&gt;环境变量

enter image description here

  

请不要使用机器级别的环境变量来代替范围   对于应用程序,有可能其他应用程序正在做   同样,改变可能会影响其他应用。

答案 5 :(得分:-1)

要设置两个或多个配置文件,您需要创建其他配置文件,mentioned in a linked articlelaunchSettings.json将包含一个数组:

"profiles": {
  "IIS Express": {
    "commandName": "IISExpress",
    "launchBrowser": true,
    "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Development"
    }
  },
  "IIS Express (Staging)": {
    "commandName": "IISExpress",
    "launchBrowser": true,
    "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Staging"
    }
  }
}

为了能够阅读环境变量,您需要specify it during startup 调用其他方法AddEnvironmentVariables来对变量采取措施:

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            // general properties
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            // specify the environment-based properties
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            // do not forget to add environment variables to your config!
            .AddEnvironmentVariables();
        Configuration = builder.Build();
    }
}