我正在使用dotnet watch
命令来运行asp.net核心项目。但是,默认情况下,它会将Production
作为环境拾取。
我已经尝试了两个选项使用:
1) > dotnet watch ASPNETCORE_ENVIRONMENT=Development
2) > dotnet run ASPNETCORE_ENVIRONMENT=Development
但它仍然将生产作为一种环境。
注意:在visualstudio中,环境变量在项目属性中默认设置为Development,从visualstudio运行会选择该变量。
问题是:如何在开发中使用命令行运行dotnet核心项目?:
1) dotnet run
2) dotnet watch
ASPNETCORE_ENVIRONMENT
是一个环境变量(和AFAIK),而不是切换到dotnet
cli。
所以你要做的是在之前设置它:
rem Windows
C:> set ASPNETCORE_ENVIRONMENT=Development
C:> dotnet ...
rem Unix
$ export ASPNETCORE_ENVIRONMENT=Development
$ dotnet ...
如果调整WebHostBuilder
处理其配置的方式,则不必使用环境变量。这只是dotnet new -t web
的默认值。例如,如果您希望能够将默认环境设置为"开发"而不是生产环境,并便于在命令行中重写环境,则可以通过从中修改普通的Program.cs
代码来实现这一点。。。
public static void Main(string[] args) {
var host = new WebHostBuilder()
.UseKestrel()
.UseUrls("http://0.0.0.0:5000")
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
变成这样。。。
private static readonly Dictionary<string, string> defaults =
new Dictionary<string, string> {
{ WebHostDefaults.EnvironmentKey, "development" }
};
public static void Main(string[] args) {
var configuration =
new ConfigurationBuilder()
.AddInMemoryCollection(defaults)
.AddEnvironmentVariables("ASPNETCORE_")
.AddCommandLine(args)
.Build();
var host =
new WebHostBuilder()
.UseConfiguration(configuration)
.UseKestrel()
.UseUrls("http://0.0.0.0:5000")
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
这样做,环境变量仍然可以工作,但您可以在命令行上覆盖它,而不需要任何第三方依赖关系,如下所示:
dotnet run environment=development
dotnet run environment=staging
这实际上就是yeoman生成器所做的。
您也可以在调用dotnet
:时内联设置变量
ASPNETCORE_ENVIRONMENT=Development dotnet run
我发现这对NPM脚本来说很好,但必须始终在dotnet
之前调用,例如:
{
...
"scripts": {
"start": "cd MyApp && ASPNETCORE_ENVIRONMENT=Development dotnet run",
"watch": "cd MyApp && ASPNETCORE_ENVIRONMENT=Development dotnet watch"
},
}
注意:这只适用于OS X或Linux;对于跨平台解决方案,可以使用cross-env
:
npm install cross-env -D
然后将脚本更改为:
{
...
"scripts": {
"start": "cd MyApp && cross-env ASPNETCORE_ENVIRONMENT=Development dotnet run",
"watch": "cd MyApp && cross-env ASPNETCORE_ENVIRONMENT=Development dotnet watch"
},
}
检查文档
https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-run?tabs=netcore21
https://learn.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-2.1
dotnet run --launch-profile EnvironmentsSample
launchSettings.json
{
"profiles": {
"EnvironmentsSample": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Staging"
},
"applicationUrl": "http://localhost:54340/"
},
}
}
使用JavaScriptServices在ASP.NET Core上构建单页应用程序(添加样式):
如果您在Windows中使用PowerShell,请执行
$Env:ASPNETCORE_ENVIRONMENT = "Development"
如果您在Windows中使用cmd.exe,请执行
setx ASPNETCORE_ENVIRONMENT "Development"
,然后重新启动命令提示符以使更改生效如果您使用Mac/Linux,请执行
export ASPNETCORE_ENVIRONMENT=Development
使用dotnet run或dotnet watch从CLI进行设置:
dotnet run --environment Development
dotnet watch run --environment Development
感谢@Technetium的回答,这里有一个对我来说非常有效的dotnetcore 2.0更新:
public class Program
{
private static readonly Dictionary<string, string> defaults = new Dictionary<string, string> {{ WebHostDefaults.EnvironmentKey, "Development" }};
private static IConfiguration config;
public static void Main(string[] args)
{
config = new ConfigurationBuilder()
.AddInMemoryCollection(defaults)
.AddEnvironmentVariables("ASPNETCORE_")
.AddCommandLine(args)
.Build();
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseConfiguration(config)
/* Following setting already accounted for in CreateDefaultBuilder() : https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.webhost.createdefaultbuilder?view=aspnetcore-2.0 */
// .UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.Build();
}
再次感谢,@Technetium