【问题标题】:dotnet run OR dotnet watch with development environment from command line?dotnet run OR dotnet watch 与命令行的开发环境?
【发布时间】:2016-09-16 07:04:49
【问题描述】:

我正在使用dotnet watch 命令运行 asp.net 核心项目。但是,默认情况下,它会选择Production 作为环境。

我已经尝试了这两种选择:

1) > dotnet watch ASPNETCORE_ENVIRONMENT=Development

2) > dotnet run ASPNETCORE_ENVIRONMENT=Development

但它仍然将生产作为环境。

注意:在 Visual Studio 中,环境变量在项目属性中默认设置为 Development,从 Visual Studio 运行会选择该变量。

问题是:如何在开发中使用命令行运行 dotnet core 项目?:

1) dotnet run
2) dotnet watch

【问题讨论】:

  • 只有我一个人,还是下面的答案都不起作用!
  • 嗯,我在使用 powershell,打开命令提示符,它工作......想知道为什么

标签: asp.net-core .net-core dotnet-cli .net-core-rc2


【解决方案1】:

ASPNETCORE_ENVIRONMENT 是一个环境变量(和 AFAIK),而不是切换到 dotnet cli。

所以你要做的就是在使用该工具之前设置它:

rem Windows
C:\> set ASPNETCORE_ENVIRONMENT=Development
C:\> dotnet ...

rem Unix
$ export ASPNETCORE_ENVIRONMENT=Development
$ dotnet ...

【讨论】:

  • 已将环境变量 ASPNETCORE_ENVIRONMENT 及其值设置为 Development,但仍在命令行中将托管环境作为生产环境。想知道 .net 核心在使用 Visual Studio 运行时如何通过在项目属性中设置这个变量来设置这个变量。不是有命令行开关吗?在 Asp.Net Rc1 中,我们曾经在项目属性的 web 命令中传递它,例如 --ASPNET_ENV Development。
  • 谢谢,我在单独的窗口中设置变量,按照您的建议工作正常。 :)
  • @Christian.k 我认为这会将整个环境设置为Development,并且在应用程序级别看不到任何更改。如果 1. 只想更改特定于应用程序 2. 如果我使用 Visual Studio Code 构建应用程序,可以通过其他方式从应用程序更改,而不是期望项目属性
  • @AviKenjale 丹尼斯完全在您设置变量的位置。如果你在 shell / cmd.exe 中设置它,它只会对你从该 shell 启动的任何命令或程序可见,不会影响从其他 shell 启动的其他应用程序(可能)设置不同的环境变量。
  • 太棒了!正如你所说,它正在工作。但是,仍然 1. 如何使用命令行将默认端口 5000 更改为其他端口? 2.这个set命令和launchSettings.json一样吗?基本上我更感兴趣的是设置环境变量,通过我的 Ubuntu 的 Visual Studio 代码或终端启动 URL。
【解决方案2】:

也可以在调用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"
  },
}

【讨论】:

  • @Konstantin 你是对的,它没有。我想添加npmjs.com/package/cross-env 可以解决问题,例如"cd MyApp && cross-env ASPNETCORE_ENVIRONMENT=开发点网运行"。
【解决方案3】:

如果您调整WebHostBuilder 处理其配置的方式,则您没有使用环境变量。这只是dotnet new -t web 的默认值。例如,如果您希望能够将默认环境设置为“开发”instead of production 并便于在命令行中覆盖环境,您可以通过修改普通的 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

这其实是the yeoman generators do

【讨论】:

  • 由于微软环境变量配置包的实现细节,ASPNETCORE_ 前缀在所有其他配置的眼中被剥离,这毫无价值。这就是您不在命令行中包含前缀的原因。
  • 如果您还没有这样做的话,您还需要将 Microsoft.Extensions.Configuration.CommandLine 包作为依赖项添加到您的项目中,这也是毫无价值的。它将包含AddCommandLine() 扩展方法。
  • 正是需要的!谢谢
  • 环境参数好像不存在了。它对我不起作用,我在文档中找不到它:docs.microsoft.com/de-de/dotnet/articles/core/tools/dotnet-run
  • 作为 dotnetcore 2.0 的更新,Microsoft.Extensions.Configuration.CommandLine 包现在似乎不需要了。
【解决方案4】:

来自Building Single Page Applications on ASP.NET Core with JavaScriptServices(已添加样式):

如果您在 Windows 中使用 PowerShell,请执行 $Env:ASPNETCORE_ENVIRONMENT = "Development"

如果您在 Windows 中使用 cmd.exe,请执行 setx ASPNETCORE_ENVIRONMENT "Development",然后重新启动命令提示符以使更改生效

如果您使用的是 Mac/Linux,请执行 export ASPNETCORE_ENVIRONMENT=Development

【讨论】:

    【解决方案5】:

    感谢@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://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.webhost.createdefaultbuilder?view=aspnetcore-2.0 */
                    // .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseStartup<Startup>()
                    .Build();
        }
    

    再次感谢@Technetium

    【讨论】:

      【解决方案6】:

      检查文档

      https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-run?tabs=netcore21

      https://docs.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/"
          },   
        }
      }
      

      【讨论】:

      • 这对我有用 -> "dotnet run --launch-profile EnvironmentsSample"
      猜你喜欢
      • 1970-01-01
      • 2021-11-07
      • 2023-02-05
      • 2019-01-20
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多