在ASP.NET Core中为开发和发布环境自动设置appsettings.json吗?


105

我已经appsettings.json为诸如数据库连接字符串,webapi位置之类的东西定义了一些值,这些值对于开发,暂存和实时环境是不同的。

有没有一种方法可以拥有多个appsettings.json文件(如appsettings.live.json,等),并让asp.net应用程序根据运行的构建配置“知道”要使用哪个文件?

Answers:


31

您可以使用条件编译:

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

28
您应该在MSBuild / TFS构建中设置环境变量。有条件的编译会导致在CI构建中易于处理的错误。即,.AddJsonFile($“ appsettings。{env.EnvironmentName} .json”,可选:true)
Nick Turner

1
请参阅我的答案(stackoverflow.com/a/50331886/1319086)中的环境变量
Jonatan Dragon,

10
这种方法会强制针对每种环境重新编译代码,从而无法在其他地方重新分发/安装。
tvdias '18

2
问题是关于“了解构建配置”的内容
德米特里(Dmitry)

6
不应将其标记为已接受的答案-尽管这是一种解决方案,但这不是最佳实践。
查理

98

我添加了一个工作环境的屏幕快照,因为它花费了我几个小时的研发时间。

  1. 首先,向launch.json文件添加密钥。

    请参阅以下屏幕截图,我已将其添加Development为我的环境。

    在launch.json中声明环境变量

  2. 然后,在您的项目中,创建一个appsettings.{environment}.json包含环境名称的新文件。

    在下面的屏幕快照中,查找两个不同名称的文件:

    • appsettings.Development.Json
    • appSetting.json


    appsettings JSON文件的项目视图

  3. 最后,将其配置为您的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();
    }
    
  4. 最后,您可以像下面这样从命令行运行它:

    dotnet run --environment "Development"
    

    "Development"我的环境名称在哪里。


2
尝试了这个,它很好用。VS2017甚至在基础文件下显示不同的版本。投票。
罗伯托

1
当ihostingenvironment被弃用时,您如何在核心2.2中做到这一点
djack109

2
@ djack109您应该IWebHostEnvironment改用。
alessandrocb

69

.NET Core 3.0+更新

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

    WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
    
    public class Startup
    {
        public Startup(IConfiguration configuration) // automatically injected
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }
        /* ... */
    }
    
  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代码>启动环境

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

    启动设定

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

    启动设置下拉菜单

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

    注意:使用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


谢谢,这很好,但是如何使用控制台进程(或工作进程模板/脚手架)执行此操作?
hB0

这不适用于最新版本,它将始终采用appsettings.json并忽略appsettings.development.json。运行(dev)和运行(prod)也丢失了。
user1034912 '20

45

在ASP.NET Core中,您应该使用环境变量代替正确的appsettings.json的构建配置

  1. 右键单击您的项目>属性>调试>环境变量

    环境变量

  2. ASP.NET Core将使用适当的appsettings.json文件:

    解决方案资源管理器中的appsettings文件示例

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

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


35

您可以使用环境变量和的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带有某些特定环境值(“实时”,“分段”,“生产”等等)的环境变量即可。您可以在开发环境的项目设置中指定此变量,当然,还需要在暂存和生产环境中进行设置。在此操作的方式取决于所处的环境。

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


我在项目属性->调试部分中使用了环境变量,但是没有明显的方法可以根据项目设置进行更改。是我可以添加到项目中的另一个文件来处理它吗?
meds's

在项目属性中设置变量仅适用于在开发环境(可能是Visual Studio)中使用它。您将需要根据特定环境(IIS,Azure)在其他位置为已部署的应用程序设置它。我不建议在某些配置文件中设置变量,因为该文件也可能会被部署,然后覆盖服务器值。
Onkel Toob

您可以在构建配置中进行设置。如果没有构建配置文件,那么他们将手动进行配置,因此他们需要在(旧的)部署配置文件中进行设置
Nick Turner

我在Azure中有多个环境,例如测试,暂存和生产。如果要将Web应用程序的发布版本从VS发布到Azure,应在哪里更改ASPNETCORE_ENVIRONMENT变量?
霜冻

我们不在部署期间更改变量,而是将变量内置到特定环境中。在Azure中,可以直接在“应用程序设置”下的应用程序服务配置中设置这些值。如果您使用多个插槽,请不要忘记将它们标记为“部署插槽设置”。
昂克尔·托布

29

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

   }
 }

2
您如何在使用的环境之间切换?是否应该在任何配置文件中进行更改?我知道我需要将要在Azure上运行项目时要使用的URL添加到appsettings.json中,并将要在本地(由F5运行)要执行的URL添加到appsettings.Development.json中。那是对的吗?我要使用的字符串在文件launchSettings.json中,我不清楚如何根据应用程序的执行位置(或是否应该对其进行更改)对其进行更改。
DonkeyBanana

3
@DonkeyBanana环境仅是项目属性中指定的设置。在VS 2017中,右键单击项目>属性。在调试下,您将看到key的当前环境ASPNETCORE_ENVIRONMENT。该值将替换为ctx.HostingEnvironment.EnvironmentName}。因此,如果您在属性中将该值设置为“ Production”,则项目将config.Production.json在根文件夹中查找文件。有关更多信息,请查看此链接
umutesen '18

Error CS0266 Cannot implicitly convert type 'Microsoft.AspNetCore.Hosting.IWebHost' to 'Microsoft.AspNetCore.Hosting.IWebHostBuilder'. An explicit conversion exists (are you missing a cast?) 在WebHost.CreateDefaultBuiler(...中创建一个
Hecatonchires'Aug

值得注意的是,这里声明“使用CreateDefaultBuilder初始化新的主机生成器时,AddJsonFile被自动调用两次”。换句话说,它已经在加载appSettings.json,然后根据您的环境配置在加载appsettings。{Environment} .json
David Yates

@umutsen在最新的Visual Studio中,没有更多的运行环境设置
user1034912 '20

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

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

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

这应该是一个公认的答案。对于复杂的情况,可以使用SlowCheetah
安东·克鲁格洛夫

8

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

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

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

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。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.