如何为不同的 OS 覆盖 appsettings.json?

How to override appsettings.json for different OS?

我的项目是简单的WebApi服务器,基于netcoreapp2.0。

我有简单的appsettings.json

{
  "logPath":"C:\logs\myLog.log"
}

而且 logPath 没问题,如果应用程序可以在 Windows 平台上运行,但我也希望 运行 它在 linux 上运行。我知道,我可以使用控制台参数或环境变量来覆盖此设置,但我想获得 OS 特定的 appsettings.json 覆盖。类似 appsettings.linux.json 的东西(可能是 appsettings 文件,取决于 RID)内容为

{
  "logPath":"\var\tmp\myLog.log"
}

理想情况下,如果这个理论 appsettings.linux.json 只包含在构建输出中,如果我将为特定的 RID 构建我的应用程序。

如果可用,我该怎么做?

您可以创建多个应用程序设置文件。

appsettings.windows.json
appsettings.linux.json

然后使用 EnvironmentName 变量在它们之间进行交换。

启动

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

如果设置了 {env.EnvironmentName},则首先加载默认的 appsettings.json 文件,然后再加载该文件。我使用它在开发、测试和生产环境之间进行交换。

添加 appsettings.linux.json 包含需要为此覆盖的变量 OS:

{
    "logPath":"\var\tmp\myLog.log"
}

Program.cs之前调用config.Build()运行:

if(RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
    config.AddJsonFile("appsettings.linux.json");
}