C# (新格式)visual studio项目中的可选appsettings.local.json

C# (新格式)visual studio项目中的可选appsettings.local.json,c#,git,visual-studio-2017,appsettings,local-files,C#,Git,Visual Studio 2017,Appsettings,Local Files,我的应用程序使用appsettings.json进行一些设置。如果存在appsettings.local.json,则应覆盖appsettings.json中包含的任何设置。到目前为止,没有问题 但我使用git进行版本控制。显然,我不希望其他用户破坏我的本地设置。所以我忽略了appsettings.json 此外,解决方案中还有很多项目。它们共享相同的设置。因此,在解决方案级别有一个appsettings.json,所有项目都将其作为链接包含 还好,除了一件事。为了可用,我必须将appsetti

我的应用程序使用appsettings.json进行一些设置。如果存在appsettings.local.json,则应覆盖appsettings.json中包含的任何设置。到目前为止,没有问题

但我使用git进行版本控制。显然,我不希望其他用户破坏我的本地设置。所以我忽略了appsettings.json

此外,解决方案中还有很多项目。它们共享相同的设置。因此,在解决方案级别有一个appsettings.json,所有项目都将其作为链接包含

还好,除了一件事。为了可用,我必须将appsettings.local.json复制到输出目录。但它不应该在版本控制中。因此,如果有人复制了新的解决方案,他们就不会拥有它。那应该很好,但事实并非如此。VS表示“应该链接此文件,但它到底在哪里?”生成错误

我该怎么处理呢?

计划:

  • 将默认本地值放置到appsettings.local base.json
  • appsettings.local.json
    添加到
    .gitignore
  • appsettings.local base.json
    作为
    appsettings.local.json
    复制到输出文件夹if
    appsettings.local.json
    不存在
  • 如果用户在项目文件夹中有自己的
    appsettings.local.json
    (它将被VS复制到输出文件夹),则不执行任何操作
  • MSBuild
    Copy
    target可以在生成之前/之后有条件地复制文件。以下目标是基于Visual Studio 2017和csproj的.NET核心项目的实际目标(文件名减少):

    
    netcoreapp1.1
    
    项目生成后,VS生成输出中应显示以下消息:

    正在将src.json文件复制到:bin\Debug\netcoreapp1.1\dest.json


    对于v2,这非常简单

  • 向项目中添加一个
    appsettings.local.json
    (它应该嵌套在主
    appsettings.json
    文件下面)
  • appsettings.local.json
    添加到
    .gitignore
  • 在构造函数中的
    startup.cs
    中,执行以下操作:

    public class Startup
    {
        public IConfigurationRoot Configuration { get; }
    
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) //load base settings
                .AddJsonFile("appsettings.local.json", optional: true, reloadOnChange: true) //load local settings
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) //load environment settings
                .AddEnvironmentVariables();
    
            Configuration = builder.Build();
        }
    
        /*
         * rest of your startup.cs
         */
    }
    

  • 看起来这件事变化太快了,很难跟踪微软希望以“正确的方式”处理这些事情

    在ASP.NETCore2中,我相信开发人员处理每个开发人员配置值的预期方法是使用


    简短摘要:在Visual Studio 2019中,右键单击项目并选择“管理用户机密”。这将在
    %APPDATA%\Microsoft\UserSecrets\…
    中创建一个JSON文件,该文件由
    WebHost.CreateDefaultBuilders()
    自动拾取(在默认ASP.NET核心项目中隐式调用)。

    对于.NET core>2.1,您可以简单地链接扩展方法
    ConfigureAppConfiguration(Action configureDelegate)
    发送到您的网络主机。以下是一个例子:

    WebHost.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((hostingContext,config)=>
    {
    config.AddJsonFile(
    “appsettings.Local.json”,
    可选:true,
    重新加载更改:true);
    })
    // ...
    

    当然,也可以忽略.gitignore中的appsettings.Local.json。

    为什么不只忽略
    appsettings.Local.json呢?每个人都需要存在该文件。我只是不想改变。