首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dotnet发布,有时将appsettings.Development.json复制为appsettings.development.json

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

Stack Overflow用户
提问于 2017-10-02 17:56:49
回答 2查看 1.9K关注 0票数 2

一般而言,.NET核心环境变量的大小写敏感性一直是一场噩梦,尤其是您开始使用.NET核心位运行Docker容器,现在我发现它再次抬头,下面是一个dotnet发布输出屏幕截图:

以下是应用程序文件的源代码:

下面是Visual中的文件名:

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

现在这个问题也发生在我和appsettings.Production.json和appsettings.Staging.json身上。是间歇性的。有时case受到dotnet发布副本的尊重,将构件构建到其发布文件夹中,而另一些时候,它降低了我的一些appsettings.json文件的环境的第一个字母。

当我在我的机器上开发时,我可以删除发布文件夹来解决这个问题,但是一旦我转到我的Linux构建服务器,dotnet发布发生在完全干净的Linux板上,在dotnet发布执行之前不存在发布文件夹,我仍然会间歇性地收到相同的问题。

另外,我只想指出,.NET核心IHostingEnvironment.IsDevelopment()方法是区分大小写的,我无法相信,但是仅仅设置代码忽略case更有挑战性,因为如果另一个开发人员信任IHostingEnvironment.IsDevelopment(),这是一个常见的.NET核心约定:

代码语言:javascript
复制
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment() || env.EnvironmentName.ToLower() == "localhost")
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseServiceStack(new AppHost());
}

我至少可以这样做,以减轻这个案件的问题:

代码语言:javascript
复制
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()的开发人员

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-02 18:13:01

IHostingEnvironment.EnvironmentName只是一个字符串属性,它有公共getter和setter。作为一个开发人员,您可以完全控制它的contains.And值,在大多数实际情况下,它只返回与ASPNETCORE_ENVIRONMENT变量相同的值。

基于HostingEnvironmentExtensions.cs实现:

  • env.IsDevelopment在内部使用相同的IHostingEnvironment.EnvironmentName获取env名称,但是的,将其与包含"Development“作为值的EnvironmentName.Development进行比较。
  • 通常,您可以使用IHostingEnvironment.IsEnvironment方法将预期的env名称作为第二个参数。

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

代码语言:javascript
复制
// IHostingEnvironment env;
env.EnvironmentName = env.EnvironmentName.ToLower();
var result = env.IsEnvironment(EnvironmentName.Development.ToLower());

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

  • 将所有配置文件重命名为小写,如appsettings.production.json
  • 修改代码,仅在小写中使用env名称: .AddJsonFile("appsettings.{env.EnvironmentName.ToLower()}.json")
票数 2
EN

Stack Overflow用户

发布于 2017-10-02 23:24:30

我想提供EnvironmentHelper类,我创建这个类是为了在所有API中帮助解决这个问题,以防其他人发现它有帮助:

代码语言:javascript
复制
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";
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46531024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档