【问题标题】:How to override appsettings.json for different OS?如何为不同的操作系统覆盖 appsettings.json?
【发布时间】:2021-04-02 03:32:13
【问题描述】:

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

我有简单的appsettings.json

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

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

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

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

如果可用,我该怎么做?

【问题讨论】:

    标签: c# .net-core .net-standard-2.0


    【解决方案1】:

    您可以创建多个 appsettings 文件。

    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 文件,然后它将加载该文件。我用它来在开发、测试和生产环境之间进行交换。

    【讨论】:

    • 感谢您的回答。是的,这是有效的解决方案。已经实现了。有趣的是知道这个问题的其他可能的解决方案。我认为可能存在一些使用 msbuild 和 RID 标识符的解决方案。
    • 我同意它也可能与 MSBuild 一起完成。
    • 我不知道你能做到这一点,这是王牌!
    【解决方案2】:

    添加 appsettings.linux.json 包含需要为此操作系统覆盖的变量:

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-12-02
      • 2021-06-02
      • 2019-01-26
      • 1970-01-01
      • 2022-01-10
      • 2015-08-09
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多