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

时间:2017-05-29 19:23:25

标签: git visual-studio-2017 appsettings local-files

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

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

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

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

我该如何处理?

3 个答案:

答案 0 :(得分:9)

对于v2来说,这很简单。

  1. 在项目中添加appsettings.local.json(它应该嵌套在主appsettings.json文件下面。)
  2. appsettings.local.json添加到您的.gitignore
  3. 在构造函数中的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
         */
    }
    

答案 1 :(得分:1)

计划:

  1. 将默认本地值设置为appsettings.local-base.json
  2. appsettings.local.json添加到.gitignore
  3. appsettings.local-base.json复制为appsettings.local.json到输出文件夹,如果 appsettings.local.json 不存在
  4. 如果用户在项目文件夹中有自己的appsettings.local.json(它将被VS复制到输出文件夹),则不执行任何操作。
  5. 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

答案 2 :(得分:1)

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

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

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