dotnet запустить ИЛИ dotnet смотреть из среды разработки из командной строки?

Я использую dotnet watch команда для запуска основного проекта asp.net. Однако по умолчанию он собирает Production как среда.

Я пробовал оба варианта, используя:

1) > dotnet watch ASPNETCORE_ENVIRONMENT=Development

2) > dotnet run ASPNETCORE_ENVIRONMENT=Development

Но он все еще воспринимает производство как окружающую среду.

Примечание. В Visual Studio переменная среды задается в свойствах проекта, так как по умолчанию разработка и запуск из Visual Studio выбирает эту переменную.

Вопрос: Как запустить основной проект dotnet в разработке из командной строки, используя либо:

1) dotnet run
2) dotnet watch

7 ответов

Решение

ASPNETCORE_ENVIRONMENT переменная окружения (и AFAIK), а не переключатель к dotnet кли.

Итак, что вы должны сделать, это установить его перед использованием инструмента:

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

Это на самом деле то, что делают йоменские генераторы.

Вы также можете установить переменную inline при вызове 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://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/"
    },   
  }
}

Источник: https://blogs.msdn.microsoft.com/webdev/2017/02/14/building-single-page-applications-on-asp-net-core-with-javascriptservices/

Стайлинг добавлен.

Если вы используете PowerShell в Windows, выполните $Env:ASPNETCORE_ENVIRONMENT = "Development"

Если вы используете cmd.exe в Windows, выполните setx ASPNETCORE_ENVIRONMENT "Development", а затем перезапустите командную строку, чтобы изменения вступили в силу

Если вы используете Mac / Linux, выполните export ASPNETCORE_ENVIRONMENT=Development

Чтобы установить из CLI с помощью dotnet run или dotnet watch:

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

Еще раз спасибо, @Technetium

Другие вопросы по тегам