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

Posted

技术标签:

【中文标题】如何在发布文件中设置 aspnetcore_environment?【英文标题】:How to set aspnetcore_environment in publish file? 【发布时间】:2016-08-31 00:08:30 【问题描述】:

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

假设我有 3 个环境 DevelopmentStagingProduction

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

    如何在.pubxml 文件中设置aspnetcore_environment

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

更新 1

我知道我必须设置 ASPNETCORE_ENVIRONMENT 但是我不明白我们在哪里设置这个?在开发过程中,我可以在launchSettings.json 的配置文件中设置它,但是问题是我们在发布到登台或生产时如何设置它?我们是否在目标服务器本身上设置环境变量?

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

【问题讨论】:

Pass hosting environment for self-hosting 的可能重复项。那里已经回答了这个问题。只需使用命令行/powershell/bash/azureportal 设置环境变量 【参考方案1】:

您可以使用以下命令将所需的 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>

【讨论】:

有可能以某种方式在发布配置文件中设置它吗? 是的@Muflix。在我的 .pubxml 文件中添加 &lt;EnvironmentName&gt;Staging&lt;/EnvironmentName&gt; 对 web.config 文件具有相同的效果。【参考方案2】:

我有同样的要求,我想出了以下解决方案。这适用于自动化部署,并且需要较少的配置更改。

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 属性。

我们也可以在发布配置文件中添加&lt;EnvironmentName&gt; 属性。打开位于Properties/PublishProfiles/profilename.pubxml 的发布配置文件,这将在发布项目时在 web.config 中设置环境名称。更多详情here

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

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

3.使用 dotnet publish 的命令行选项

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

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

【讨论】:

#2 这是真正的答案。 #2 也是我的答案,但需要滚动阅读很多内容,最后找到 Microsoft Docs docs.microsoft.com/en-us/aspnet/core/host-and-deploy/… 不幸的是,#2 对我不起作用:/ 我必须直接编辑 web.config,不知道我做错了什么。 #2 运行良好,因为它修改了 web.config 并在发布过程中更改了 ASPNETCORE_ENVIRONMENT 值。 这里看到的问题是Environment和Configuration不一样。我只想为我的任何环境提供调试和发布配置:开发、暂存、生产。【参考方案3】:

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

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

要在发布时生成它,请将 web.config 添加到项目的根目录,“dotnet 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>

【讨论】:

但是你必须创建多个 web.config,一个用于每个支持的环境,如开发、uat、prod 等。我在这篇 SO 帖子中找到了答案***.com/questions/40748518/… 你可以直接在 IIS 中设置环境变量在应用程序级别 取决于用例,如果它是一个企业环境,您无法通过 web.config 控制托管服务器,这可能是让某人更新 IIS 的最佳选择配置或用户环境可能是一个漫长的过程。如果您确实可以控制服务器设置环境变量可能是更好的选择。 如何在部署过程中动态改变值?发布会处理它吗? @LP13 这才是关键,不是吗。我对开发和暂存没有问题——开发是本地的,暂存在单独的 IIS 服务器上——但这个答案不会帮助我让生产在第三台服务器上工作。【参考方案4】:

我认为您不能在发布配置文件中执行此操作。您必须设置环境变量,例如ASPNETCORE_ENVIRONMENT = 暂存。 我不得不对 Azure 上的 aspnet 核心 Web 应用程序做类似的事情。我想要开发、登台和生产。我这样做的方式正是使用 env 变量。

【讨论】:

【参考方案5】:

要设置两个或多个配置文件,您需要创建额外的配置文件,如mentioned in a linked article,而您的launchSettings.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();
    

【讨论】:

这对出版肯定没用吗?这是为了在本地启动它。 对持续集成非常有用【参考方案6】:

在 Visual Studio IDE 中设置它的简单方法。

项目>属性>调试>环境变量

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

【讨论】:

需要修改配置文件

以上是关于如何在发布文件中设置 aspnetcore_environment?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 INI 配置文件中设置布尔值?

如何在 Spring 配置文件中设置 WebSSOProfileConsumerImpl

如何在 Nuxt 配置中设置 .env 文件路径?

如何在 mongodb 配置文件中设置授权?

如何在 Netbeans 中设置环境变量?

如何在 CMFCEditBrowseCtrl::EnableFileBrowseButton 中设置默认文件扩展名?