(新格式)Visual Studio 项目中的可选 appsettings.local.json

Posted

技术标签:

【中文标题】(新格式)Visual Studio 项目中的可选 appsettings.local.json【英文标题】:Optional appsettings.local.json in (new format) visual studio project 【发布时间】:2017-10-30 03:54:09 【问题描述】:

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

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

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

还好,除了一件事。为了可用,我必须将 appsettings.local.json 复制到输出目录。但它不应该在版本控制中。因此,如果有人克隆了新鲜的解决方案,他们将不会拥有它。那应该没问题,但事实并非如此。 VS。说“这个文件应该被链接,但它到底在哪里?”构建错误。

我该如何处理?

【问题讨论】:

你为什么不 git ignore appsettings.local.json only? 该文件需要为每个人都存在。我只是不想推送更改。 【参考方案1】:

对于 .Net Core >2.1,您可以简单地将扩展方法 ConfigureAppConfiguration(Action<WebHostBuilderContext, IConfigurationBuilder> configureDelegate) 链接到您的 WebHost。这是一个例子:

WebHost.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((hostingContext, config) =>
    
        config.AddJsonFile(
            "appsettings.Local.json",
             optional: true,
             reloadOnChange: true);
    )
    // ...

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

【讨论】:

【参考方案2】:

似乎这些东西变化如此之快,很难跟踪微软希望处理这些事情的“正确方式”。

在 ASP.NET Core 2 中,我相信开发人员处理每个开发人员配置值的预期方法是使用 Secret Manager。

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

【讨论】:

【参考方案3】:

使用 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
         */
    
    

【讨论】:

【参考方案4】:

计划:

    将默认本地值设置为appsettings.local-base.json。 将appsettings.local.json 添加到.gitignore。 将appsettings.local-base.json 复制为appsettings.local.json 到输出文件夹如果 appsettings.local.json 不存在。 如果用户在项目文件夹中有自己的appsettings.local.json,则什么也不做(它将被VS复制到输出文件夹)。

MSBuild Copy 目标可以在构建之前/之后有条件地复制文件。下面的目标是 Visual Studio 2017 和基于 csproj 的 .NET Core 项目的实际目标(文件名已减少):

<Project Sdk="Microsoft.NET.Sdk.Web">

    <PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
    </PropertyGroup>

    <!--rest of file -->  

    <Target Name="TestTarget" AfterTargets="Build">
        <ItemGroup>
            <FromFile Include="src.json" />
            <ToFile Include="$(OutDir)dest.json" />
        </ItemGroup>

        <Message Text="Copying @(FromFile) file to: @(ToFile)" Importance="high" />

        <Copy   
            SourceFiles="@(FromFile)" 
            DestinationFiles="@(ToFile)" 
            Condition="!Exists('@(ToFile)')" 
            OverwriteReadOnlyFiles="true" 
            SkipUnchangedFiles="false" />
    </Target>  
</Project>

项目构建后,VS 构建输出中应出现以下消息:

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

【讨论】:

以上是关于(新格式)Visual Studio 项目中的可选 appsettings.local.json的主要内容,如果未能解决你的问题,请参考以下文章

如何共享Visual Studio 2017代码样式和格式?

如何在Visual Studio中嵌入命令shell

Visual Studio 2010 运行时库

带有 Visual Studio 2012 RC 的 MVC 4 / Razor 中的可移植类库?

安装Visual Studio2013

在 Visual Studio 2008 中将目录添加到 CAB 项目