C# 使用正确的转换设置发布.NET核心控制台应用程序

C# 使用正确的转换设置发布.NET核心控制台应用程序,c#,.net-core,C#,.net Core,我对.NET核心应用程序非常陌生,我想知道是否有一种简单的方法可以根据概要文件部署正确的application.json。 在.NET标准应用程序中,它非常简单,因为我们有web.config转换/但它似乎不适用于.NET核心控制台应用程序 我也在网上读到,有了ASP.NET核心应用程序,我们可以使用 var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettin

我对.NET核心应用程序非常陌生,我想知道是否有一种简单的方法可以根据概要文件部署正确的application.json。 在.NET标准应用程序中,它非常简单,因为我们有web.config转换/但它似乎不适用于.NET核心控制台应用程序

我也在网上读到,有了ASP.NET核心应用程序,我们可以使用

var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) <--this
.AddEnvironmentVariables();
Configuration = builder.Build();
var builder=new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile(“appsettings.json”,可选:true,重载更改:true)

.AddJsonFile($“appsettings.{env.EnvironmentName}.json”,可选:true)您可以这样做:

public static void Main(string[] args)
{
    var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

    var builder = new ConfigurationBuilder()
        .AddJsonFile($"appsettings.json", true, true)
        .AddJsonFile($"appsettings.{environmentName}.json", true, true)
        .AddEnvironmentVariables();
    Configuration = builder.Build();   
}
请记住添加
Microsoft.Extensions.Configuration.Json
nuget软件包。 还有一种方法可以获得
ASPNETCORE\u环境
,如下所示:

new ConfigurationBuilder().AddEnvironmentVariables()
var builder = new HostBuilder();

builder.ConfigureAppConfiguration((ctx, b) => b
  .AddJsonFile($"appsettings.{ctx.HostingEnvironment.EnvironmentName}.json"));
并在那里找到了背景


当然,您需要将这些配置复制到输出文件夹,以便可以访问why。

您可以尝试这样做:

public static void Main(string[] args)
{
    var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

    var builder = new ConfigurationBuilder()
        .AddJsonFile($"appsettings.json", true, true)
        .AddJsonFile($"appsettings.{environmentName}.json", true, true)
        .AddEnvironmentVariables();
    Configuration = builder.Build();   
}
请记住添加
Microsoft.Extensions.Configuration.Json
nuget软件包。 还有一种方法可以获得
ASPNETCORE\u环境
,如下所示:

new ConfigurationBuilder().AddEnvironmentVariables()
var builder = new HostBuilder();

builder.ConfigureAppConfiguration((ctx, b) => b
  .AddJsonFile($"appsettings.{ctx.HostingEnvironment.EnvironmentName}.json"));
并在那里找到了背景


当然,您需要将这些配置复制到输出文件夹,以便可以访问why。

您可以使用Microsoft.Extensions.Configuration.Json()

等效代码如下所示:

new ConfigurationBuilder().AddEnvironmentVariables()
var builder = new HostBuilder();

builder.ConfigureAppConfiguration((ctx, b) => b
  .AddJsonFile($"appsettings.{ctx.HostingEnvironment.EnvironmentName}.json"));

据我所知,这只适用于.NETCore2.1。HostBuilder的工作原理与ASP.NET WebHostBuilder非常相似,在NuGet软件包Microsoft.Extensions.Hosting中提供。

您可以使用Microsoft.Extensions.Configuration.Json()

等效代码如下所示:

new ConfigurationBuilder().AddEnvironmentVariables()
var builder = new HostBuilder();

builder.ConfigureAppConfiguration((ctx, b) => b
  .AddJsonFile($"appsettings.{ctx.HostingEnvironment.EnvironmentName}.json"));

据我所知,这只适用于.NETCore2.1。HostBuilder的工作原理与ASP.NET WebHostBuilder非常相似,可以在NuGet软件包Microsoft.Extensions.Hosting中使用。

您确实可以访问环境。这就足够了:

var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();

您确实可以访问环境。这就足够了:

var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();

为了改进@MarkusDresch的答案,我想知道OP是否说这仍然不起作用,因为他们没有设置正确的环境。您需要正确设置它,例如从hostsetting.json的env变量:

            var host = new HostBuilder()
                   .ConfigureHostConfiguration(builder =>
                   {
                       builder.AddJsonFile("hostsettings.json", optional: true);
                   })
                   .ConfigureAppConfiguration((hostContext, builder) =>
                   {
                       builder.AddJsonFile("appsettings.json");
                       builder.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true);
                   })
在本例中,hostsettings.json的内容如下:

{
  "environment": "Development",
}

为了改进@MarkusDresch的答案,我想知道OP是否说这仍然不起作用,因为他们没有设置正确的环境。您需要正确设置它,例如从hostsetting.json的env变量:

            var host = new HostBuilder()
                   .ConfigureHostConfiguration(builder =>
                   {
                       builder.AddJsonFile("hostsettings.json", optional: true);
                   })
                   .ConfigureAppConfiguration((hostContext, builder) =>
                   {
                       builder.AddJsonFile("appsettings.json");
                       builder.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true);
                   })
在本例中,hostsettings.json的内容如下:

{
  "environment": "Development",
}


即使它是一个控制台吗?是的,这只是一个适当的轻触的问题。如果没有,请添加:Microsoft.Extensions.Configuration、Microsoft.Extensions.Configuration.Json、Microsoft.Extensions.Configuration、Microsoft.Extensions.Configuration.FileExtensions、Microsoft.Extensions.Configuration.EnvironmentVariables。对不起,我在控制台应用程序中,不是ASP.net。。。。它不能“解析
ASPNETCORE_环境”
,而且它是有意义的…@advapi所有扩展都可以在任何应用程序上工作。您可以在任何机器上定义该环境变量,它工作正常。您可以使用任何想要的环境变量名,它只是一个字符串!不过,使用
ASPNETCORE\u环境是一种常见的习惯。我已经读过了。。。但是仍然无法克服我的困难。你告诉过EnviromentName可以是字符串,但这意味着在QA/Stage/Prod Enviroment上,我必须为属性设置一个变量,该属性可以是
ASPNETCORE\u ENVIRONMENT
或其他任何东西,即使它是控制台App?是的,这只是适当的Nuges的问题。如果没有,请添加:Microsoft.Extensions.Configuration、Microsoft.Extensions.Configuration.Json、Microsoft.Extensions.Configuration、Microsoft.Extensions.Configuration.FileExtensions、Microsoft.Extensions.Configuration.EnvironmentVariables。对不起,我在控制台应用程序中,不是ASP.net。。。。它不能“解析
ASPNETCORE_环境”
,而且它是有意义的…@advapi所有扩展都可以在任何应用程序上工作。您可以在任何机器上定义该环境变量,它工作正常。您可以使用任何想要的环境变量名,它只是一个字符串!不过,使用
ASPNETCORE\u环境是一种常见的习惯。我已经读过了。。。但是仍然无法克服我的困难。您告诉过EnviromentName可以是字符串,但这意味着在QA/Stage/Prod Enviroment上,我必须为属性设置一个变量,该属性可以是
ASPNETCORE\u ENVIRONMENT
或其他任何无法解决我的问题
HostBuilder
,它是在什么程序集中定义的?ThanksIt是在Microsoft.Extensions.Hosting.Thanks中定义的,但这给了我与@Dawid帖子中相同的情况。这应该是公认的答案。ctx将是HostBuilderContext类型。它不会解析我
HostBuilder
,它是在什么程序集中定义的?ThanksIt是在Microsoft.Extensions.Hosting.Thanks中定义的,但这给了我与@Dawid帖子中相同的情况。这应该是可以接受的答案。ctx将是HostBuilderContext类型。您可以在控制台应用程序中使用完全相同的代码。Microsoft.Extensions.*包(如配置、依赖项注入、日志记录)并不特定于一个环境。在.NET标准中,我将它们用于许多命令行工具SBTW,而您没有转换
Microsoft.Extensions.Configuration
是.NET标准库。Transformatino只是整个.NET框架的一部分,由于过于复杂而被放弃。您可以覆盖配置值,而不是带有所有怪癖的转换(是否发现转换导致无效的配置文件?)。而不是改变任何东西