使用命令行在开发环境下运行dotnet run或dotnet watch?

98

我正在使用dotnet watch命令运行asp.net core项目。但默认情况下,它选择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

是我自己的问题还是下面的回答都没用? - Ayyash
1
嗯,我之前用的是PowerShell,转换到命令提示符后它就运行成功了……不知道为什么。 - Ayyash
7个回答

135

ASPNETCORE_ENVIRONMENT 是一个环境变量(据我所知),并不是 dotnet 命令行工具的开关。

因此,在使用该工具之前,您需要先设置它:

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

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

3
已经设置了环境变量 ASPNETCORE_ENVIRONMENT 的值为 Development,但在命令行中仍然采用生产环境作为托管环境。想知道 .net core 在使用 Visual Studio 运行时如何设置此变量,是否有命令行开关可用?在 Asp.Net Rc1 中,我们曾通过项目属性的 Web 命令传递它,例如:--ASPNET_ENV Development。 - Nexus23
谢谢,我在另一个窗口中设置了变量,按照你的建议运行良好。 :) - Nexus23
@AviKenjale,那是Dennis完全在你设置变量的地方。如果你在shell/cmd.exe中设置它,它只对从该shell启动的命令或程序可见,对于从其他shell启动的应用程序(可能)以不同方式设置环境变量的情况没有影响。 - Christian.K
太棒了!它确实按照您所说的运作。然而,仍有以下疑问:
  1. 如何使用命令行将默认端口5000更改为其他端口?
  2. 这个“set”命令和“launchSettings.json”是相同的吗?基本上,我更希望通过我的Ubuntu的Visual Studio Code或终端来设置环境变量和启动URL。
- Avi Kenjale
@SkorunkaFrantišek,只需要进行一些小的更改就可以实现。我写了一个答案来解释如何实现。 - Technetium
显示剩余8条评论

40

如果您调整WebHostBuilder处理其配置的方式,则不必使用环境变量。这仅仅是dotnet new -t web的默认设置。例如,如果您想将默认环境设置为"development" 而不是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

实际上,这就是Yeoman生成器所做的事情


1
值得注意的是,由于微软环境变量配置包的实现细节,所有其他配置项都会忽略 ASPNETCORE_ 前缀。这就是为什么在命令行中不需要包含该前缀的原因。 - Technetium
4
值得注意的是,如果你还没有这样做,你需要将 Microsoft.Extensions.Configuration.CommandLine 包作为你项目的依赖项添加进去。它将包含 AddCommandLine() 扩展方法。 - Technetium
1
看起来环境参数不再存在了。对我没用,我在文档中找不到它:https://learn.microsoft.com/de-de/dotnet/articles/core/tools/dotnet-run - lex82
好的,抱歉。我应该仔细阅读你的答案,而不是只是匆匆浏览它;-) - lex82
1
作为 dotnetcore 2.0 的更新,Microsoft.Extensions.Configuration.CommandLine 包现在似乎不再必要。 - Bishop
显示剩余9条评论

35

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

1
@Konstantin 你说得对,确实不行。我想添加 https://www.npmjs.com/package/cross-env 应该可以解决问题,例如 "cd MyApp && cross-env ASPNETCORE_ENVIRONMENT=Development dotnet run"。 - Geir Sagberg

28

这对我起作用: "dotnet run --launch-profile EnvironmentsSample" - Asad Ali

22

来自在ASP.NET Core上使用JavaScriptServices构建单页面应用程序(已添加样式):

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

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

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


9

通过使用dotnet run或dotnet watch从CLI设置:

dotnet run --environment Development

dotnet watch run --environment Development


我相信你是对的,但是当我输入:dotnet run --environment Production时,它仍然输出“Hosting environment: Development”,所以不确定如何说服任何人这实际上是有效的。 - PandaWood
@PandaWood,你是否可能在某个地方打错了字?如果我输入:“dotnet run --environment noob”,我会收到“info: Microsoft.Hosting.Lifetime[0] Hosting environment: noob”的信息,但如果我拼写错误,则会得到“development”。如果你真的想这样做,你也可能意外地手动覆盖了.NET查找变量的层次结构,因为这些可以在Program.cs中更改。 - David Mays
1
生成的文件 Properties\launchSettings.json 似乎覆盖了环境变量和命令行参数。 - user423430
适用于 .net core 6,只需创建一个新的 appsettings.Custom.json 文件,然后运行 dotnet watch run --environment Custom - Ron Michael
dotnet watch run --project 项目名称 - undefined

1

感谢@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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接