dotnet从命令行使用开发环境运行OR dotnet watch



我正在使用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

最新更新