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

Posted

技术标签:

【中文标题】找不到配置文件“secrets.json”并且不是可选的(.NET 6)【英文标题】:the configuration file 'secrets.json' was not found and is not optional (.NET 6) 【发布时间】:2021-11-21 16:47:31 【问题描述】:

在 CI/CD 管道中生成用户机密错误,此时不应出现 secrets.json 文件。

步骤:

    创建 .NET 5 项目 添加了用户机密。 代码在本地和 CI/CD 管道中运行。 升级到 .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

【问题讨论】:

单元测试不应该依赖于机密(它们只是开发机器的功能)。可以粘贴配置 ConfigurationBuilder 的单元测试的开头吗? 谢谢,是的,我知道,这只是一个例子 您的堆栈跟踪显示的路径不是“secrets.json”路径。用户机密存储在%UserProfile%\AppData\Roaming\Microsoft\UserSecrets\<projectSecretGuid>\secrets.json 中。是否有人添加了对机密文件的直接引用,然后将该文件设置为“内容”/“复制到输出”? 【参考方案1】:

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

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

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

您的代码中的“可选”参数应设置为“真”。

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

【讨论】:

真实的帮助很大,真实的改变了游戏规则?拯救了我的夜晚【参考方案2】:

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

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


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

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

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

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

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

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


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

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


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

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

【讨论】:

【参考方案3】:

在 .net 6.0 中,应用程序需要 secret.json 才能运行。无论如何,如果您要从 .net core 3.1 或 .net 5.0 迁移以便在 .net 6.0 中运行您的应用程序:

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

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

【讨论】:

以上是关于找不到配置文件“secrets.json”并且不是可选的(.NET 6)的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试制作一个 YT api,但每次我得到的都是这个错误:没有这样的文件或目录:'client_secrets_file.json'

Symfony 4 部署后找不到翻译文件

为啥找不到我的芹菜配置文件?

AB PLC程序上载提示找不到MODULE配置文件

找不到此可执行文件的有效配置文件

Mysql启动服务提示系统找不到指定的文件