在 asp.net 核心中为开发和发布环境自动设置 appsettings.json?

Automatically set appsettings.json for dev and release environments in asp.net core?

我在我的 appsettings.json 中定义了一些值,例如数据库连接字符串、webapi 位置等,这些值在开发、暂存和实时环境中是不同的。

有没有办法拥有多个 appsettings.json 文件(如 appsettings.live.json 等)并让 asp.net 应用仅 'know' 使用哪个基于在构建配置上它是 运行?

您可以像这样在 Startup 构造函数中使用环境变量和 ConfigurationBuilder class:

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" 是环境名称。请注意,您可以将所有全局配置值放入 "normal" appsettings.json 文件中,并且只将环境特定的内容放入这些新文件中。

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

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

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

  1. 首先,将密钥添加到您的 launch.json 文件。

    看下面的截图,我添加了Development作为我的环境。

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

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

    • appsettings.Development.Json
    • appSetting.json


  3. 最后,将其配置为您的 StartUp class,如下所示:

    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" 是我的环境名称。

您可以使用条件编译:

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

仅针对.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);

   }
 }

在 ASP.NET Core 中,您应该使用环境变量而不是构建配置来获得正确的 appsettings.json

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

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

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

Note: If you use , you can run into problems eg. when overriding appsettings.json values on Azure.

您可以在launchSettings.json中添加配置名称作为ASPNETCORE_ENVIRONMENT,如下所示

  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:58446/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "environmentVariables": {
        ASPNETCORE_ENVIRONMENT": "$(Configuration)"
      }
    }
  }
  1. 创建多个 appSettings.<i>$(Configuration)</i>.json 文件,例如:

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

    copy appSettings.$(Configuration).json appSettings.json
    
  3. 在您的 Config Builder 中仅使用 appSettings.json

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

.NET Core 3.0+ 更新

  1. 您可以使用 CreateDefaultBuilder,它将自动构建配置对象并将其传递给您的启动 class:

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

  3. 然后在运行/debugging

  4. 时设置ASPNETCORE_ENVIRONMENT环境变量

如何设置环境变量

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

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

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

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

    也可以从 Visual Studio

    中的工具栏中选择

  • 使用 dotnet CLI,使用

    的适当语法

    Note: When an app is launched with dotnet run, launchSettings.json is read if available, and environmentVariables settings in launchSettings.json override environment variables.

Host.CreateDefaultBuilder 是如何工作的?

.NET Core 3.0 添加了 Host.CreateDefaultBuilder under platform extensions which will provide a default initialization of IConfiguration,它按以下顺序为应用程序提供默认配置:

  1. appsettings.json using the JSON configuration provider.
  2. appsettings.<i>Environment</i>.json using the JSON configuration provider. For example:
    • appsettings.<i>Production</i>.json or
    • appsettings.<i>Development</i>.json
  3. App secrets when the app runs in the Development environment.
  4. Environment variables using the Environment Variables configuration provider.
  5. Command-line arguments using the Command-line configuration provider.

进一步阅读 - MS 文档

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

当我在没有网页的情况下使用控制台应用程序时,这个版本适合我:

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