Command line dotnet——环境文档?

Command line dotnet——环境文档?,command-line,environment,asp.net-core-2.2,Command Line,Environment,Asp.net Core 2.2,我目前正在使用ASP.NET Core 2.2进行开发: dotnet --info .NET Core SDK (reflecting any global.json): Version: 2.2.300 Commit: 73efd5bd87 Runtime Environment: OS Name: Windows OS Version: 10.0.17134 OS Platform: Windows RID: win10-x64 Base

我目前正在使用ASP.NET Core 2.2进行开发:

dotnet --info
.NET Core SDK (reflecting any global.json):
 Version:   2.2.300
 Commit:    73efd5bd87

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.17134
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\2.2.300\
和运行:

dotnet myapp.dll --environment=Local
将我的IHostingEnvironment设置为“Local”,但我找不到任何关于--environment的官方文档,也找不到它是否将用作覆盖ASPNETCORE_环境变量的官方文档(但似乎没有)

在构建配置、设置日志记录等时,我特别需要在Program.cs中使用此参数,并且不希望在系统范围内使用ASPNETCORE_环境

但是,在Program.cs中,我似乎需要手动读取参数(以及不存在参数的句柄),因为IHostingEnvironment直到稍后才设置,Environment.GetEnvironmentVariable(“ASPNETCORE_Environment”)显然将为空

当然,如果设置了ASPNETCORE_环境,我仍然需要处理,并适当地选择使用哪个,这就是为什么我需要知道框架的其余部分如何处理--ENVIRONMENT参数的原因。因此我可以照做。

首先,传递
--environment
实际上会覆盖
ASPNETCORE\u environment
环境变量,至少在默认配置设置中是这样,并且假设您实际使用config来获取值(
IHostingEnvironment
是由config组成的,因此很重要)

默认情况下,
WebHost.CreateDefaultBuilder
在控制台参数之前加载环境变量,控制台参数是最后包含的配置提供程序。如果您正在使用
ConfigureAppConfiguration
进行自定义操作,或者从头开始构建主机,那么情况可能不再如此

在任何情况下,ASP.NET核心所使用的实际环境都来自config,但是值会到达那里。你的问题中不清楚的是1)你是否在做一些干扰默认行为的自定义操作,2)你试图以何种方式访问和使用它不起作用的环境

一般来说,您希望构建主机,然后从主机的服务集合中拉出
IHostingEnvironment
。例如:

public static void Main(string[] args)
{
    var host = CreateWebHostBuilder(args).Build();

    var env = host.Services.GetRequiredService<IHostingEnvironment>();

    host.Run();
} 
还可以构建服务集合并以这种方式将其拉出:

var provider = services.BuildServiceProvider();
var env = provider.GetRequiredService<IHostingEnvironment>();

我的问题是,在构建主机之前,我需要知道我所处的环境,这样我就可以设置日志并将其附加到主机上(但我还需要在Program.cs中记录行)。看来我只需要先处理命令行参数,然后再使用环境变量,如果两者都不存在,则默认为生产。谢谢你提供的信息。你在哪里设置日志?实际上,在任何可以附加额外日志记录的地方,都可以访问环境,因此我不确定问题出在哪里。日志记录是在Program.cs的主功能中设置的,在设置主机之前会记录行。记录器本身是根据环境配置的,我们从appSettings.%environment%.json文件中获取设置,但是如果未设置ASPNETCORE_环境,则使用environment.GetEnvironmentVariable(“ASPNETCORE_environment”)返回null,并且使用--environment参数不会填充该环境变量。所以这是混乱的一部分。我们只需要手动读取环境,这样就可以提前获得正确的配置。希望这是有道理的。看,我认为你没有抓住重点。您需要从IHostingEnvironment获取环境,而不是直接从GetEnvironmentVariable获取环境。Pass——环境不设置环境变量;它改变了用于编写iHostingVrioment的配置。是的,奇怪的是,考虑到它对许多事情的重要性,它没有更好的文档记录。然而,它最终只是基于配置,就像大多数其他东西一样。ops for config的默认顺序是JSON--environment标志本身与其说是一个标志,不如说是直接将一个参数传递到config中。
--
将继续执行您想要传递的任何配置设置,
environment
部分是配置键的名称。相关问题。
var provider = services.BuildServiceProvider();
var env = provider.GetRequiredService<IHostingEnvironment>();
public static void Main(string[] args)
{
    CreateWebHostBuilder(args)
        .ConfigureLogging(context =>
        {
            // define additional logging providers
            // get environment via `context.HostingEnvironment`
        }).Build().Run();