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



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

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

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

仍然很好,除了一件事。为了可用,我必须将AppSettings.local.json复制到输出目录。但这不应该在版本控制中。因此,如果有人将解决方案施加新鲜,他们就不会有。那应该很好,但事实并非如此。VS.说:"这个文件应该链接,但是到底在哪里?"构建错误。

我该如何处理?

with 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
         */
    }
    

对于.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。

for .net 6,您可以使用此。

另外,请确保您忽略appsettings.local.json,以避免入住敏感信息,例如密码和秘密。

var builder = WebApplication.CreateBuilder(args);
// Add configurations
builder.Host.ConfigureAppConfiguration((hostingContext, config) =>
{
    config.Sources.Clear();
    var env = hostingContext.HostingEnvironment;
    config.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();
    if (args != null)
    {
        config.AddCommandLine(args);
    }
});

不能说我喜欢在源代码中添加这个环境特定的东西,将其添加为像 appsetting.local.json这样的文件似乎更干净,然后在您的launchSettings.json中确保添加环境变量作为本地。


{
  "profiles": {
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "local"
      }
    }
  }
}

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
            // Avoid this nasty code in your codebase, its oddly specific for a particular environment.
            //.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. 将默认的本地值放在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复制到输出文件夹(。

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

<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

似乎这种东西变化如此之快,很难跟踪"正确的方式",微软想要这些事情处理。

在ASP.NET Core 2中,我相信开发人员处理人均配置值的预期方法与秘密管理器一起。

简短摘要:在Visual Studio 2019中,右键单击该项目,然后选择管理用户秘密。这将在%APPDATA%MicrosoftUserSecrets...中创建一个JSON文件,该文件由WebHost.CreateDefaultBuilders()自动拾取(默认ASP.NET Core Projects中隐式称为(。

相关内容

  • 没有找到相关文章

最新更新