在asp.net核心中自动为dev和release环境设置appsettings.json?

twe*_*ypi 54 c# appsettings asp.net-core

我已经在我appsettings.json的数据库连接字符串,webapi位置等内容中定义了一些值,这些值对于开发,登台和实时环境是不同的.

有没有办法有多个appsettings.json文件(如appsettings.live.json,等等),并让asp.net应用程序'知道'根据它运行的构建配置使用哪一个?

Kyl*_*Mit 108

.NET Core 3.0+ 的更新

  1. 您可以使用CreateDefaultBuilderwhich 将自动构建并将配置对象传递给您的启动类:

    WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
    
    Run Code Online (Sandbox Code Playgroud)
    public class Startup
    {
        public Startup(IConfiguration configuration) // automatically injected
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }
        /* ... */
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. CreateDefaultBuilder自动包含适当的文件,因此为每个环境添加一个单独的 appsettings 文件:appsettings.Environment.json

    appsettings.env.json

  3. 然后在运行/调试时设置ASPNETCORE_ENVIRONMENT 环境变量

如何设置环境变量

根据您的 IDE,dotnet 项目通常会在几个地方查找环境变量:

  • 对于Visual Studio,转到项目 > 属性 > 调试 > 环境变量:

    Visual Studio - 环境变量

  • 对于Visual Studio Code,编辑.vscode/launch.json> env

    Visual Studio Code > 启动环境

  • 使用Launch Settings,编辑Properties/launchSettings.json> environmentVariables

    启动设置

    也可以从 Visual Studio 的工具栏中选择

    启动设置下拉菜单

  • 使用dotnet CLI,使用适当的语法为每个操作系统设置环境变量

    注意:当使用dotnet run启动应用程序时, launchSettings.json如果可用则读取,并且environmentVariableslaunchSettings.json 中的设置会覆盖环境变量。

如何Host.CreateDefaultBuilder工作?

Host.CreateDefaultBuilder在平台扩展下添加了 .NET Core 3.0 ,它将提供默认初始化,IConfiguration其按以下顺序为应用程序提供默认配置:

  1. appsettings.json使用JSON 配置提供程序
  2. appsettings.Environment.json使用JSON 配置提供程序。例如:
    • appsettings.Production.json 或者
    • appsettings.Development.json
  3. 应用程序在开发环境中运行时的应用程序机密
  4. 使用环境变量配置提供程序环境变量
  5. 使用命令行配置提供程序命令行参数。

进一步阅读 - MS Docs

  • 这不适用于最新版本,它将始终采用 appsettings.json 并忽略 appsettings.development.json。Run (dev) 和 run (prod) 也丢失了。 (3认同)
  • @Mehnaz,我相信是这样。我认为您不受任何预设的可用环境名称的约束。它只会采用您在环境变量中设置的任何名称,并使用它来构建应用程序设置文件的命名规则。 (2认同)

Bha*_*rat 55

我已经添加了工作环境的快照,因为它花了我几个小时进行研发.

首先添加您的Launch.Json文件的密钥.

见下面的快照,我添加"Development"了我的环境.

在此输入图像描述

然后在项目中添加具有相同名称的appSetting文件.

添加了snap,查找以2命名的不同文件.

  • appSettings.Development.Json
  • appSetting.json

在此输入图像描述

最后将它配置为您的StartUp类,如下所示.

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();
    }
Run Code Online (Sandbox Code Playgroud)

最后我从终端运行它像这样.

dotnet run --environment"开发"

发展是我的环境.

  • @djack109 你应该使用 `IWebHostEnvironment` 来代替。 (3认同)
  • 尝试了这个,它很好用。VS2017甚至在基础文件下显示不同的版本。投票。 (2认同)

umu*_*sen 27

只是.NET核心2.0用户的更新,您可以在调用后指定应用程序配置CreateDefaultBuilder:

public class Program
{
   public static void Main(string[] args)
   {
      BuildWebHost(args).Run();
   }

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

   static void ConfigConfiguration(WebHostBuilderContext ctx, IConfigurationBuilder config)
   {
            config.SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("config.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"config.{ctx.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);

   }
 }
Run Code Online (Sandbox Code Playgroud)

  • @DonkeyBanana环境只不过是项目属性中指定的设置.在VS 2017中,右键单击项目>属性.在调试下,您将看到关键字"ASPNETCORE_ENVIRONMENT"的当前环境.该值将替换为`ctx.HostingEnvironment.EnvironmentName}`.因此,如果将属性中的值设置为"Production",项目将在根文件夹中查找`config.Production.json`文件.有关详细信息,请查看此链接(https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-2.1#setting-the-environment) (3认同)
  • 您如何在使用的环境之间切换?是否应该在任何配置文件中进行更改?我知道我需要将项目在 Azure 上运行时要使用的 URL 添加到 *appsettings.json*,并将本地运行(按 F5)时要执行的 URL 添加到 *appsettings.Development.json*。那是对的吗?我想使用的字符串在文件 *launchSettings.json* 中,我不太清楚如何根据应用程序的执行位置(或者是否应该更改它)来更改它。 (2认同)

Jon*_*gon 27

在ASP.NET Core中,您应该使用EnvironmentVariables而不是构建配置来正确使用appsettings.json

右键单击项目> Properties> Debug> Environment Variables

在此输入图像描述

ASP.NET Core将采用适当的appsettings.json文件.

现在您可以像这样使用该环境变量:

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();
    }
Run Code Online (Sandbox Code Playgroud)

如果你这样做@Dmitry的方式,你会遇到问题,例如.在Azure上覆盖appsettings.json值时.


Dmi*_*try 25

您可以使用条件编译:

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
#if SOME_BUILD_FLAG_A
    .AddJsonFile($"appsettings.flag_a.json", optional: true)
#else
    .AddJsonFile($"appsettings.no_flag_a.json", optional: true)
#endif
    .AddEnvironmentVariables();
    this.configuration = builder.Build();
}
Run Code Online (Sandbox Code Playgroud)

  • 您应该在MSBuild/TFS构建中设置环境变量.条件编译会导致CI构建中容易处理的错误.即,.AddJsonFile($"appsettings.{env.EnvironmentName} .json",optional:true) (11认同)
  • 这种方法迫使代码专门针对每个环境进行重新编译,从而无法在其他地方重新分发/安装. (6认同)
  • 问题是关于“了解构建配置” (3认同)
  • 不应将其标记为已接受的答案-尽管这是一种解决方案,但这不是最佳实践。 (2认同)

Onk*_*oob 23

您可以ConfigurationBuilderStartup构造函数中使用环境变量和类,如下所示:

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
    .AddEnvironmentVariables();
    this.configuration = builder.Build();
}
Run Code Online (Sandbox Code Playgroud)

然后,appsettings.xxx.json为所需的每个环境创建一个文件,其中"xxx"是环境名称.请注意,您可以将所有全局配置值放在"普通" appsettings.json文件中,并仅将特定于环境的内容放入这些新文件中.

现在,您只需要一个ASPNETCORE_ENVIRONMENT具有某些特定环境值("live","staging","production"等)的环境变量.您可以在开发环境的项目设置中指定此变量,当然还需要在暂存和生产环境中设置它.你在那里的方式取决于这是什么样的环境.

更新:我刚刚意识到你想appsettings.xxx.json根据你当前的构建配置选择.使用我提出的解决方案无法实现这一点,我不知道是否有办法做到这一点.然而,"环境变量"方式有效,并且可能是您的方法的一个很好的替代方案.


小智 14

  1. 创建多个文件,如:appSettings.$(Configuration).json

    • appSettings.staging.json
    • appSettings.production.json
  2. 在项目上创建一个预构建事件,将相应的文件复制到appSettings.json

    copy appSettings.$(Configuration).json appSettings.json
    
    Run Code Online (Sandbox Code Playgroud)
  3. appSettings.json在您的配置生成器中使用:

    var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables();
    
    Configuration = builder.Build();
    
    Run Code Online (Sandbox Code Playgroud)

  • 这应该是一个可以接受的答案。对于复杂的情况,可以使用[SlowCheetah](/sf/answers/3726475511/)。 (2认同)

Nic*_*ova 8

这是在使用没有网页的控制台应用程序时对我有用的版本:

var builder = new ConfigurationBuilder()
             .SetBasePath(Directory.GetCurrentDirectory())
             .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
             .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true);

            IConfigurationRoot configuration = builder.Build();
            AppSettings appSettings = new AppSettings();
            configuration.GetSection("AppSettings").Bind(appSettings);
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以添加配置名称作为ASPNETCORE_ENVIRONMENTlaunchSettings.json如下

  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:58446/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "environmentVariables": {
        ASPNETCORE_ENVIRONMENT": "$(Configuration)"
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)


小智 7

"appsettings"通过在文件名的和部分之间添加环境名称".json",它将覆盖主appsettings.json文件中的任何设置。

例如,如果您在生产环境中有不同的 SQL Server 连接字符串,您可以将该连接字符串添加到appsettings.Production.json,它将使用该文件中的值。

在此输入图像描述

要选择配置文件或环境,请在ASPNETCORE_ENVIRONMENTlaunchSettings.json中打开并设置环境:

   "IIS Express": {
     "commandName": "IISExpress",
     "launchBrowser": true,
     "environmentVariables": {
       "ASPNETCORE_ENVIRONMENT": "Development"
     }
   }
Run Code Online (Sandbox Code Playgroud)

和设置:

var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var builder = new ConfigurationBuilder()
    .AddJsonFile($"appsettings.json", true, true)
    .AddJsonFile($"appsettings.{environment}.json", true, true)
    .AddEnvironmentVariables();
Run Code Online (Sandbox Code Playgroud)


Oks*_*Xen 5

.vscode/launch.json 文件仅由 Visual Studio 以及 /Properties/launchSettings.json 文件使用。不要在生产中使用这些文件。

launchSettings.json 文件:

  1. 仅在本地开发机器上使用。
  2. 未部署。
  3. 包含配置文件设置。

    • launchSettings.json 中设置的环境值会覆盖系统环境中设置的值

例如,使用文件“appSettings.QA.json”。您可以使用“ASPNETCORE_ENVIRONMENT”。请按照以下步骤操作。

  1. 在主机上添加一个新的环境变量并将其命名为“ASPNETCORE_ENVIRONMENT”。将其值设置为“QA”。
  2. 在项目中创建文件“appSettings.QA.json”。在此添加您的配置。
  3. 部署到步骤 1 中的计算机。确认“appSettings.QA.json”已部署。
  4. 加载您的网站。期望在此处使用 appSettings.QA.json。

  • 这是否意味着,如果您有 5 个环境和 5 个 appsettings.EnvName.json 文件,那么所有这些文件都将被部署,并且只有一台选定的计算机,因为构建定义的工件将包含所有 5 个文件?或者只应该部署 appsettings.json (作为主)+ appsettings.CurrentEnvironment.json (作为覆盖)以及如何部署? (2认同)