配置文件 'secrets.json' 未找到并且不是可选的 (.NET 6)
the configuration file 'secrets.json' was not found and is not optional (.NET 6)
CI/CD 管道中正在生成用户机密错误,而不应预期 secrets.json 文件。
步骤:
- 创建 .NET 5 项目
- 添加了用户机密。
- 代码在本地和 CI/CD 管道中运行。
- 升级到 .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 中的应用程序:
- 运行
dotnet user-secrets init
在您的项目文件夹中使用命令行工具。
- 确保您的应用域
...\bin\Debug\net6.0
中有一个 secret.json
文件。您的 secret.json
文件暂时是否为空并不重要。
按 F5 键 运行 您的应用程序!
CI/CD 管道中正在生成用户机密错误,而不应预期 secrets.json 文件。
步骤:
- 创建 .NET 5 项目
- 添加了用户机密。
- 代码在本地和 CI/CD 管道中运行。
- 升级到 .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 中的应用程序:
- 运行
dotnet user-secrets init
在您的项目文件夹中使用命令行工具。 - 确保您的应用域
...\bin\Debug\net6.0
中有一个secret.json
文件。您的secret.json
文件暂时是否为空并不重要。
按 F5 键 运行 您的应用程序!