找不到配置文件“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\<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"
最后在项目的根目录中添加创建的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'