dotnet发布有时将appsettings.Development.json复制为appsettings.development.json

时间:2017-10-02 17:56:49

标签: .net asp.net-core .net-core

一般来说,.NET Core Environment变量的区分大小写一直是个噩梦,特别是你开始使用.NET Core位运行Docker容器,现在我发现它再次变得丑陋,这里是一个dotnet发布输出截图:

enter image description here

以下是appsettings文件的源代码:

enter image description here

以下是Visual Studio中的文件名: enter image description here

使用git我可以证明" D"在开发中确实是Windows文件名的大写:

enter image description here

现在这个问题也发生在appsettings.Production.json和appsettings.Staging.json上。这是间歇性的。有时情况会受到dotnet发布副本构建工件到其发布文件夹的尊重,但有时候它会为我的某些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核心约定,环境区分大小写,这仍然留下了一个"漏洞"在计划中,对于我使用IHostingEnvironment.IsDevelopment()

的开发人员提到的潜力

2 个答案:

答案 0 :(得分:2)

<tf.Tensor 'Conv2D_1:0' shape=(?, 16, 16, 1) dtype=float32> 只是一个字符串属性,它同时包含公共getter和setter。作为开发人员,您可以完全控制它包含的值。在大多数实际情况下,它只返回与ASPNETCORE_ENVIRONMENT变量中相同的值。

基于HostingEnvironmentExtensions.cs实施:

  • IHostingEnvironment.EnvironmentName在内部使用相同的env.IsDevelopment获取env名称,但是,将其与包含“Development”作为值的IHostingEnvironment.EnvironmentName进行比较。

  • 一般来说,您可以使用EnvironmentName.Development方法获取预期的env名称作为第二个参数。

作为示例,以下代码生成不区分大小写的结果:

IHostingEnvironment.IsEnvironment

关于文件,您可以执行以下操作:

  • 将所有配置文件重命名为小写,例如// IHostingEnvironment env; env.EnvironmentName = env.EnvironmentName.ToLower(); var result = env.IsEnvironment(EnvironmentName.Development.ToLower());
  • 修改您的代码,仅使用小写的env名称:

    appsettings.production.json

答案 1 :(得分:-1)

我想提供我创建的EnvironmentHelper课程,以便在我的所有API中协助解决此问题,以防其他人发现它有用:

public static class EnvironmentHelper
{
    public static bool IsLocalhost(string env)
    {
        return IsEnvironment(env, EnvironmentName.Localhost);
    }

    public static bool IsDevelopment(string env)
    {
        return IsEnvironment(env, EnvironmentName.Development);
    }

    public static bool IsStaging(string env)
    {
        return IsEnvironment(env, EnvironmentName.Staging);
    }

    public static bool IsProduction(string env)
    {
        return IsEnvironment(env, EnvironmentName.Production);
    }

    private static bool IsEnvironment(string env, string environmentName)
    {
        return string.Equals(env, environmentName, StringComparison.CurrentCultureIgnoreCase);
    }
}

public static class EnvironmentName
{
    public static readonly string Localhost = "Localhost";
    public static readonly string Development = "Development";
    public static readonly string Staging = "Staging";
    public static readonly string Production = "Production";
}