如何针对不同操作系统覆盖appsettings.json?

Fra*_*k59 5 c# .net-core .net-standard-2.0

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

我有简单的appsettings.json

{
  "logPath":"C:\logs\myLog.log"
}
Run Code Online (Sandbox Code Playgroud)

logPath如果应用程序可以在 Windows 平台上运行,那没关系,但我也想在 Linux 上运行它。我知道,我可以使用控制台参数或环境变量来覆盖此设置,但我想获得操作系统特定的覆盖appsettings.json。类似于appsettings.linux.json(可能是 appsettings 文件,取决于 RID)的内容

{
  "logPath":"\var\tmp\myLog.log"
}
Run Code Online (Sandbox Code Playgroud)

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

如果可用的话我该怎么做?

DaI*_*mTo 4

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

appsettings.windows.json
appsettings.linux.json

然后使用环境名称变量在它们之间进行交换。

启动

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

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

  • 感谢您的回答。是的,这是有效的解决方案。已经实施了。了解此问题的其他可能解决方案很有趣。我认为可能存在一些使用 msbuild 和 RID 标识符的解决方案。 (2认同)