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

the configuration file 'secrets.json' was not found and is not optional (.NET 6)

CI/CD 管道中正在生成用户机密错误,而不应预期 secrets.json 文件。

步骤:

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

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

"The configuration file 'secrets.json' was not found and is not optional."

预计:

代码在 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

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

中向您展示

要了解用户机密,让我们继续之前的示例 post。在那里我有一个看起来像这样的 appsettings.json 文件:

{
  "AppSettings": {
    "ConnectionString": "http://localhost:9000"
  },
  ...
}

为了覆盖个别机器上的 AppSettings:ConnectionString 设置,每个用户都需要添加一个同名的用户密码。最简单的方法是右键单击该项目并 select 管理用户机密:

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

<PropertyGroup>
  <UserSecretsId>dda25df4-9a88-4a7e-8502-2134b74e4729</UserSecretsId>
</PropertyGroup>

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

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

{
  "AppSettings": {
    "ConnectionString": "http://localhost:9000?user=mehdidaustany&password=1234"
  }
}

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

{
  "AppSettings:ConnectionString": "http://localhost:9000?user=mehdidaustany&password=1234"
}

最后在项目的根目录中添加 created secrets.json

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

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

AddUserSecrets(this IConfigurationBuilder configuration, Assembly assembly, bool optional);

'optional' 参数应在您的代码中设置为 'true'。

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

在 .net 6.0 中,应用程序需要 secret.json 到 运行。在任何情况下,如果您要从 .net core 3.1 或 .net 5.0 迁移以便 运行 您在 .net 6.0 中的应用程序:

  1. 运行 dotnet user-secrets init 在您的项目文件夹中使用命令行工具。
  2. 确保您的应用域 ...\bin\Debug\net6.0 中有一个 secret.json 文件。您的 secret.json 文件暂时是否为空并不重要。

按 F5 键 运行 您的应用程序!