【发布时间】:2017-10-02 17:56:49
【问题描述】:
一般来说,.NET Core 环境变量的大小写敏感性一直是一场噩梦,尤其是当你开始使用 .NET Core 位运行 Docker 容器时,现在我发现它又抬起了丑陋的脑袋,这是一个 dotnet 发布输出截图:
这里是 appsettings 文件的源代码:
使用 git 我可以证明开发中的“D”确实是 Windows 文件名的大写:
现在这个问题也发生在我的 appsettings.Production.json 和 appsettings.Staging.json 中。它是间歇性的。有时,dotnet publish 会尊重大小写,将构建工件复制到其发布文件夹,但有时它会将我的一些 appsettings.json 文件的环境首字母小写。
当我在我的机器上开发时,我可以删除发布文件夹来解决问题,但是一旦我进入我的 Linux 构建服务器并且 dotnet 发布发生在完全干净的 Linux 平板上,在 dotnet 发布执行之前不存在发布文件夹我仍然间歇性地遇到同样的问题。
另外,只是想指出 .NET Core IHostingEnvironment.IsDevelopment() 方法是区分大小写的,我不敢相信,但是将我的代码设置为忽略大小写更具挑战性,因为如果另一个开发者信任 IHostingEnvironment.IsDevelopment(),这是一个常见的 .NET Core 约定:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment() || env.EnvironmentName.ToLower() == "localhost")
{
app.UseDeveloperExceptionPage();
}
app.UseServiceStack(new AppHost());
}
我至少可以这样做,以缓解这个案例问题:
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName.ToLower()}.json", optional: true, reloadOnChange: true);
但再次参考 .NET Core 约定,环境大小写敏感性这仍然在我上面提到的开发人员使用IHostingEnvironment.IsDevelopment() 的计划中留下了一个“漏洞”
【问题讨论】:
标签: .net asp.net-core .net-core