在我的应用程序中,我使用appsettings来加载配置。我有appsettings.json
:
{
"FileReader": {
"InputDirectory": "tmp"
}
}
我希望能够使用命令行参数速记开关(例如:-i
)。我知道我可以通过一个名为FileReader__InputDirectory
的环境变量覆盖它,但是对于我的Program.cs
中的SwitchMappings,我不知道什么值会起作用。下面是我的代码:
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, builder) =>
{
builder
.AddJsonFile("appsettings.json", false, false)
.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", true, false)
.AddEnvironmentVariables()
.AddCommandLine(source =>
{
source.Args = args;
source.SwitchMappings = new Dictionary<string, string>()
{
{ "-i", "FileReader__InputDirectory" } // <-- what is the correct mapping here?
};
});
})
.ConfigureServices((context, services) =>
{
Console.WriteLine(context.Configuration.GetSection("FileReader")["InputDirectory"]);
services.AddHostedService<Worker>();
})
.Build();
当我运行dotnet run -i ./source/json
时,我希望打印出的值是source/json(参数中的值),但我得到的是tmp(appsettings.json
文件中的值)。
如果我尝试在appsettings根级别上使用属性而不进行嵌套,它会工作得很好。
2条答案
按热度按时间6yt4nkrj1#
使用
:
作为分隔符:__
是:
的替代,特别是对于环境变量。请注意,您可以通过CLI参数(see this answer)传递它:
参见:
:
分隔符并不适用于所有平台上的环境变量分层键。例如,Bash不支持:
分隔符。所有平台都支持双下划线(__
),它会自动替换环境变量中的任何:
分隔符。System.CommandLine
执行参数解析insrf1ej2#
看起来真实的的问题是如何添加新的参数Map,而不是如何覆盖设置。
所有配置源都可以通过ConfigurationBuilder.Sources列表获得。配置代码可以找到现有的源并更改其Map:
删除整个
ConfigureAppConfiguration
部分,并在命令行中使用--FileReader:InputDirectory
覆盖JSON设置。通用主机配置JSON、环境变量 * 和 * CLI参数。没有必要再次添加相同的源。
ASP.NET核心配置中的命令行参数部分显示了如何使用各种分隔符(如
--
、=
或/
)传递参数,例如:或
在您的情况下,可以使用