dotnet-环境文档?

时间:2019-07-19 16:55:27

标签: 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 Path:   C:\Program Files\dotnet\sdk\2.2.300\

并运行:

dotnet myapp.dll --environment=Local

会将我的IHostingEnvironment设置为“ Local”,但我找不到有关--environment的任何正式文档,也找不到该文件是否可以替代ASPNETCORE_ENVIRONMENT环境变量(似乎没有)。

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

但是似乎在Program.cs中,我将需要手动读取参数(以及缺少参数的句柄),因为直到稍后才设置IHostingEnvironment,而Environment.GetEnvironmentVariable(“ ASPNETCORE_ENVIRONMENT”)显然为NULL。 / p>

当然,我仍然需要处理是否设置了ASPNETCORE_ENVIRONMENT,并适当选择要使用的选项,这就是为什么我需要知道框架的其余部分如何处理--environment参数的原因。所以我可以照做。

1 个答案:

答案 0 :(得分:2)

首先,传递--environment实际上会覆盖ASPNETCORE_ENVIRONMENT环境变量,至少会影响默认配置设置,并假设您实际上是在使用config来获取值({{ 1}}是由config组成的,因此很重要。

默认情况下,IHostingEnvironment会在控制台参数之前加载环境变量,控制台参数是其中包含的最后一个配置提供程序。如果您要使用WebHost.CreateDefaultBuilder进行自定义操作或从头开始构建主机,则可能不再是这种情况。

无论如何,ASP.NET Core所使用的实际环境来自config,但是该值到达了那里。从您的问题中不清楚的是:1)您是否正在做一些会干扰默认行为的自定义操作,以及2)您尝试以何种方式访问​​和使用不起作用的环境。

通常来说,您要构建主机,然后从主机的服务集合中拉出ConfigureAppConfiguration。例如:

IHostingEnvironment

但是,如果您需要以public static void Main(string[] args) { var host = CreateWebHostBuilder(args).Build(); var env = host.Services.GetRequiredService<IHostingEnvironment>(); host.Run(); } 之类的方式访问环境,则显然需要寻找另一种方法。对于ConfigureServices,您实际上可以注入Startup并在构造函数中使用它设置一个ivar,prop等:

IHostingEnvironment

还可以构建服务集合并将其以这种方式拉出:

public Startup(IConfiguration configuration, IHostingEnvironment environment)
{
    Environment = environment;
}

此后,您仍然可以继续更改服务集合。请注意,使用这两种方法,从技术上来讲,您并没有获得最终状态:很显然,只有已注册的服务才可用,并且稍后会发生对config之类的更改。但是,对于类似环境名称的结果,结果应该是一致的。

在类似var provider = services.BuildServiceProvider(); var env = provider.GetRequiredService<IHostingEnvironment>(); 的地方,有一个重载通过ConfigureAppConfiguration。您可以直接从该对象访问WebHostBuilderContextConfigurationHostingEnvironment等也是如此。

我认为这应该涵盖几乎所有情况。

编辑

所以,我想我终于了解了您面临的问题。首先,您假设应该通过使用字面量ConfigureLogging来检索“环境”,而不理解为什么在控制台中传递Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")不会对此产生影响。不会的“环境”是根据配置和环境变量确定的,特别是--environment只是一种可能的来源。传递ASPNETCORE_ENVIRONMENT将影响控制台参数配置提供程序。环境的唯一可靠来源是--environment

第二,我认为您没有在正确的位置或正确的方式添加所需的其他日志记录,或者您可能根本不知道在执行此操作时如何获取环境。如果您希望它在运行IHostingEnvironment之前可用,则需要使用Startup,特别是,您需要传递ConfigureLogging以便获得环境:

WebHostBuilderContext