找不到配置文件“secrets.json”并且不是可选的(.NET 6)

Meh*_*any 22 .net c# .net-6.0

当不应预期有 Secrets.json 文件时,CI/CD 管道中会生成用户机密错误。

脚步:

  1. 创建.NET 5项目
  2. 添加了用户机密。
  3. 代码在本地和 CI/CD 管道中运行。
  4. 升级到 .NET 6 项目(并预览 NuGet 6.* 包)

代码在本地运行,但在 CI/CD 管道中失败,并出现错误:

“找不到配置文件‘secrets.json’并且不是可选的。”

预期的:

代码在没有 Secrets.json 文件的情况下运行配置 .NET 6,Microsoft.Extensions.Configuration.UserSecrets:6.0.0-preview.1.21102.12

回归?这适用于 .NET 5,Microsoft.Extensions.Configuration.UserSecrets:5.0.0.*

System.IO.FileNotFoundException: The configuration file 'secrets.json' was not found and is not optional. The physical path is '/home/runner/work/UserSecretsRegression/UserSecretsRegression/UserSecrets/UserSecrets.Tests/bin/Release/net6.0/secrets.json'.
  Stack Trace:
      at Microsoft.Extensions.Configuration.FileConfigurationProvider.HandleException(ExceptionDispatchInfo info)
   at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload)
   at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load()
   at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
   at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
   at UserSecrets.Tests.UnitTest1.TestMethod1() in /home/runner/work/UserSecretsRegression/UserSecretsRegression/UserSecrets/UserSecrets.Tests/UnitTest1.cs:line 13
Run Code Online (Sandbox Code Playgroud)

Nei*_*eil 51

https://github.com/dotnet/runtime/issues/48485

基本上,这是 .NET6 中的一个新功能,默认情况下“secrets.json”不是可选的!

AddUserSecrets(this IConfigurationBuilder configuration, Assembly assembly, bool optional);
Run Code Online (Sandbox Code Playgroud)

该“可选”参数应在代码中设置为“true”。

 var configuration = new ConfigurationBuilder()
    .AddEnvironmentVariables()
    .AddCommandLine(args)
    .AddJsonFile("appsettings.json")
    .AddUserSecrets<Program>(true)
    .Build();
Run Code Online (Sandbox Code Playgroud)


Meh*_*any 5

与环境变量不同,用户机密放置在类似于appsettings.json. 当您需要在文件之间复制键和值时,拥有类似的结构化项目外设置非常有用,并且支持添加、删除和列出值,我将在本文后面向您展示。

为了了解用户机密,让我们继续上一篇文章中的示例。在那里我有一个appsettings.json如下所示的文件:

{
  "AppSettings": {
    "ConnectionString": "http://localhost:9000"
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)

为了覆盖AppSettings:ConnectionString各个计算机上的设置,每个用户都需要添加具有相同名称的用户密码。最简单的方法是右键单击该项目并选择Manage User Secrets

在此输入图像描述

这将创建并打开一个名为 的新空 JSON 文件secrets.json。该文件位于与您的 Windows 用户匹配的C:\Users\<username>\AppData\Roaming\Microsoft\UserSecrets\<id>位置下方<username>,并且是随机生成的 GUID。这里需要注意的重要一点是该文件位于项目目录之外。为了将secrets.json文件位置“绑定”到您的项目,Visual Studio 在文件中添加了一些标记csproj

<PropertyGroup>
  <UserSecretsId>dda25df4-9a88-4a7e-8502-2134b74e4729</UserSecretsId>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

如果您不使用 Visual Studio,您可以生成随机 GUID 并<UserSecretsId>手动添加。

如果您想覆盖该AppSettings:ConnectionString设置,请向文件添加类似的结构secrets.json

{
  "AppSettings": {
    "ConnectionString": "http://localhost:9000?user=mehdidaustany&password=1234"
  }
}
Run Code Online (Sandbox Code Playgroud)

您还可以像这样折叠设置:

{
  "AppSettings:ConnectionString": "http://localhost:9000?user=mehdidaustany&password=1234"
}
Run Code Online (Sandbox Code Playgroud)

最后添加secrets.json在项目根目录中创建的内容。