多环境.NET Core

Gia*_*ris 6 .net asp.net json asp.net-core

我有一个 .NET Core 项目,需要管理多个环境。假设我有开发、暂存和生产环境。我必须为每个环境管理不同的变量。在我的应用程序中,Startup.cs我已经成功地appsettings.{env.EnvironmentName}.json工作了,因此当我启动我的应用程序时,--launch-profile "ProfileName"我拥有正确的配置。

现在我的问题是我必须部署这个解决方案,所以我必须做类似的事情dotnet publish --launch-profile "ProfileName"我知道这种语法不存在,这就是我问这个问题的原因。我无法ASPNETCORE_ENVIRONMENT在主机上设置变量机器范围,因为我在同一台机器上有多个部署(具有多个环境)。我需要一种使用正确配置文件进行部署的方法,以便appsettings.json正确的应用程序能够识别正确的配置文件。谢谢。

Cod*_*ler 4

否,dotnet publish不提供为指定环境部署特定版本的配置文件的可能性。我相信这很好,因为遵循关注点分离原则。

您仍然有多种选择来覆盖您的用例:

1.Powershell仅允许使用$Env命令为当前PowerShell会话设置环境变量。您可以创建简单的 powershell 启动器来设置ASPNETCORE_ENVIRONMENT环境变量,然后启动应用程序:

$Env:ASPNETCORE_ENVIRONMENT = "Production"
# Command for launching your application
Run Code Online (Sandbox Code Playgroud)

ASPNETCORE_ENVIRONMENT环境变量只能在当前会话中访问,并且不会与应用程序的其他部署发生冲突。

此解决方案在某种程度上类似于 Tomas Lycken 建议的方法,但不需要为每个环境创建服务帐户。

2.您还可以放弃动态选择配置文件 ( appsettings.{env.EnvironmentName}.json)。您可以将所有特定于环境的设置放入一个文件(例如appSettings.environemntSpecific.json),并仅部署某些特定环境(例如开发或生产)所需的一个版本。ASPNETCORE_ENVIRONMENT在这种情况下,您根本不需要设置。

为此,请从BuildWebHost方法加载新的配置文件:

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.AddJsonFile("appSettings.environemntSpecific.json", optional: true);
        }).UseStartup<Startup>()
        .Build();
Run Code Online (Sandbox Code Playgroud)

这里的最后一步是将所需版本的appSettings.environemntSpecific.json文件放在dotnet publish命令后面。同样,dotnet publish不提供任何此类选择的可能性,因此您应该使用最简单的copy命令自己完成。

  • 我相信这应该是你最后的选择,这就是为什么我什至没有在我的回答中提到它。ASP.Net Core 从使用 web.config 转向使用 json 配置文件和其他配置源。但是,如果您仍然想尝试这种方式,请查看这篇文章作为开始 - http://bartwullems.blogspot.com.by/2017/11/webconfig-transformations-in-net-core.html (2认同)