72 votes

dotnet run OU dotnet watch avec l'environnement de développement à partir de la ligne de commande ?

J'utilise dotnet watch pour exécuter le projet asp.net core. Cependant, par défaut, il récupère la commande Production comme environnement.

J'ai essayé les deux options en utilisant :

1) > dotnet watch ASPNETCORE_ENVIRONMENT=Development

2) > dotnet run ASPNETCORE_ENVIRONMENT=Development

Mais il capte toujours la production en tant qu'environnement.

Note : Dans Visual Studio, la variable d'environnement est définie dans les propriétés du projet comme Développement par défaut et l'exécution à partir de Visual Studio choisit cette variable.

La question est : Comment exécuter un projet dotnet core en développement à partir de la ligne de commande en utilisant l'un ou l'autre ?

1) dotnet run
2) dotnet watch

0 votes

C'est moi, ou aucune des réponses ci-dessous n'a fonctionné !

0 votes

Mm, j'utilisais powershell, je suis passé à l'invite de commande et ça a marché... je me demande pourquoi.

111voto

Christian.K Points 18883

ASPNETCORE_ENVIRONMENT est une variable d'environnement (et AFAIK) qui n'est pas un commutateur de l'interface utilisateur. dotnet cli.

Donc ce que vous feriez c'est de le mettre avant à l'utilisation de l'outil :

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

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

3 votes

J'ai défini une variable d'environnement ASPNETCORE_ENVIRONMENT et sa valeur est le développement, mais dans la ligne de commande, l'environnement d'hébergement est toujours considéré comme la production. Je me demande comment .net core définit cette variable lorsqu'il fonctionne avec Visual Studio en la définissant dans les propriétés du projet. N'y a-t-il pas un commutateur en ligne de commande ? Dans Asp.Net Rc1 nous avions l'habitude de le passer dans la commande web des propriétés du projet comme --ASPNET_ENV Development.

0 votes

Merci, je configurais la variable dans une fenêtre séparée, cela fonctionne bien comme vous l'avez suggéré :)

0 votes

@Christian.k Je pense que cela va régler l'environnement entier sur Development et ne peut voir aucun changement au niveau de l'application. Que se passe-t-il si 1. vous voulez changer uniquement l'application spécifique 2. vous voulez changer l'application spécifique ? Y a-t-il un moyen de modifier l'application, sans s'attendre à ce que les propriétés du projet soient modifiées, par un autre moyen, si je construis l'application à l'aide de Code Visual Studio

34voto

Technetium Points 747

Tu ne le fais pas. ont d'utiliser des variables d'environnement si vous modifiez la façon dont le WebHostBuilder traite sa configuration. Il s'agit simplement de la valeur par défaut pour dotnet new -t web . Par exemple, si vous voulez être en mesure de définir l'environnement par défaut comme étant "développement", vous pouvez utiliser les options suivantes au lieu de la production et faciliter le remplacement de l'environnement dans la ligne de commande, vous pouvez le faire en modifiant la commande normale Program.cs code de ce ...

    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();
    }

... en quelque chose comme ça ...

    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();
    }

En procédant ainsi, les variables d'environnement continueront de fonctionner, mais vous pouvez les remplacer sur la ligne de commande sans aucune dépendance de tiers, comme suit :

dotnet run environment=development
dotnet run environment=staging

C'est en fait ce que les générateurs de yeoman font .

1 votes

Il ne faut pas oublier qu'en raison d'un détail de mise en œuvre du paquet de configuration des variables d'environnement de Microsoft, l'adresse de l'ordinateur de l'utilisateur n'a pas été modifiée. ASPNETCORE_ est dépouillé aux yeux de tous les autres éléments de configuration. C'est pourquoi il ne faut pas inclure le préfixe sur la ligne de commande.

4 votes

Il ne faut pas oublier non plus que vous devrez ajouter l'option Microsoft.Extensions.Configuration.CommandLine comme dépendance de votre projet si vous ne l'avez pas encore fait. Il contiendra le AddCommandLine() méthode d'extension.

0 votes

Exactement ce qu'il faut ! Merci à vous

28voto

Geir Sagberg Points 436

Vous pouvez également définir la variable en ligne lorsque vous appelez dotnet :

ASPNETCORE_ENVIRONMENT=Development dotnet run

J'ai trouvé que c'est très bien pour NPM scripts, mais doit toujours être appelé juste avant dotnet par exemple :

{
  ...
  "scripts": {
    "start": "cd MyApp && ASPNETCORE_ENVIRONMENT=Development dotnet run",
    "watch": "cd MyApp && ASPNETCORE_ENVIRONMENT=Development dotnet watch"
  },
}

Note : Cela ne fonctionne que sous OS X ou Linux ; pour une solution multiplateforme, vous pouvez utiliser cross-env :

npm install cross-env -D

Ensuite, changez le scripts en :

{
  ...
  "scripts": {
    "start": "cd MyApp && cross-env ASPNETCORE_ENVIRONMENT=Development dotnet run",
    "watch": "cd MyApp && cross-env ASPNETCORE_ENVIRONMENT=Development dotnet watch"
  },
}

1 votes

@Konstantin Vous avez raison, ce n'est pas le cas. J'imagine qu'ajouter npmjs.com/package/cross-env fera l'affaire, par exemple : "cd MyApp && cross-env ASPNETCORE_ENVIRONMENT=Development dotnet run".

19voto

emragins Points 433

Desde Création d'applications monopages sur ASP.NET Core avec JavaScriptServices (stylisme ajouté) :

Si vous utilisez PowerShell sous Windows, exécutez $Env:ASPNETCORE_ENVIRONMENT = "Development"

Si vous utilisez cmd.exe sous Windows, exécutez setx ASPNETCORE_ENVIRONMENT "Development" et ensuite redémarrez votre invite de commande pour que le changement prenne effet

Si vous utilisez Mac/Linux , exécutez export ASPNETCORE_ENVIRONMENT=Development

1voto

Bishop Points 61

Grâce à la réponse de @Technetium, voici une mise à jour de dotnetcore 2.0 qui fonctionne très bien pour moi :

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();
    }

Merci encore, @Technetium

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X