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

时间:2017-09-22 11:59:52

标签: c# asp.net-core appsettings

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

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

10 个答案:

答案 0 :(得分:61)

.NET Core 3.0+的更新

  1. 您可以使用CreateDefaultBuilder,它将自动生成配置对象并将其传递给启动类:

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

    appsettings.env.json

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

如何设置环境变量

根据您的IDE的不同,dotnet项目在传统上会寻找环境变量:

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

    Visual Studio - Environment Variables

  • 对于 Visual Studio代码,请编辑.vscode/launch.json> env

    Visual Studio Code > Launch Environment

  • 使用启动设置,编辑Properties/launchSettings.json> environmentVariables

    Launch Settings

    还可以从Visual Studio的工具栏中选择哪个

    Launch Settings Dropdown

  • 使用 dotnet CLI ,为setting environment variables per your OS

    使用适当的语法

    注意:使用dotnet run启动应用时,将读取launchSettings.json(如果可用),并且launchSettings.json中的environmentVariables设置将覆盖环境变量。< / p>

Host.CreateDefaultBuilder如何工作?

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

  1. appsettings.json使用JSON configuration provider
  2. appsettings.Environment.json使用JSON configuration provider。例如:
    • appsettings.Production.json
    • appsettings.Development.json
  3. App secrets,当应用程序在开发环境中运行时。
  4. 使用Environment Variables configuration provider的环境变量。
  5. 使用Command-line configuration provider的命令行参数。

进一步阅读-MS文档

答案 1 :(得分:42)

我已经添加了工作环境的快照,因为它为R&amp; D花费了几个小时。

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

请参阅下文,我已添加 "Development" 作为我的环境。

enter image description here

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

添加了snap,查找以。

命名的2个不同文件
  • appSettings.Development.Json
  • appSetting.json

enter image description here

最后将它配置为您的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();
    }

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

  

dotnet run --environment“Development”

发展是我的环境。

答案 2 :(得分:26)

您可以使用条件编译:

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();
}

答案 3 :(得分:21)

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

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();
}

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

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

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

答案 4 :(得分:21)

只是.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);

   }
 }

答案 5 :(得分:11)

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

右键点击你的项目&gt;属性&gt;调试&gt;环境变量

enter image description here

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();
    }

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

答案 6 :(得分:4)

您可以按如下所示在class CustomHyperlinkedModelSerializer(HyperlinkedModelSerializer ): def get_default_field_names(self, declared_fields, model_info): return ( [model_info.pk.name] + [self.url_field_name] + list(declared_fields) + list(model_info.fields) + list(model_info.forward_relations) ) 中将配置名称添加为StyleOperationsFileUpload.SaveAs(path); //don't think it has any thing to do with this one

ASPNETCORE_ENVIRONMENT

答案 7 :(得分:3)

当使用不带网页的控制台应用程序时,此版本适用于我:

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);

答案 8 :(得分:0)

1。创建多个appSettings。$ {Configuration).jsons如 appSettings.staging.json appSettings.production.json

2。在项目上创建一个预构建事件,将其复制到appSettings.json中

复制appSettings。$(Configuration).json appSettings.json

3。在配置生成器中仅使用appSettings.json

var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();

答案 9 :(得分:0)

.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。