web-dev-qa-db-fra.com

dotnet run OR montre dotnet avec environnement de développement à partir de la ligne de commande?

J'utilise dotnet watch commande pour exécuter le projet principal asp.net. Cependant, par défaut, il récupère le Production en tant qu’environnement.

J'ai essayé les deux options en utilisant:

1) > dotnet watch ASPNETCORE_ENVIRONMENT=Development

2) > dotnet run ASPNETCORE_ENVIRONMENT=Development

Cependant, la production reste un environnement.

Remarque: La variable d'environnement de Visual Studio est définie dans les propriétés du projet en tant que Développement par défaut et s'exécutant à partir de Visual Studio la sélectionne.

La question est: Comment faire pour exécuter le projet de base dotnet en développement à partir de la ligne de commande en utilisant soit ?:

1) dotnet run
2) dotnet watch
55
Nexus23

ASPNETCORE_ENVIRONMENT est une variable d’environnement (et autant que je sache) et non un passage à la dotnet cli.

Donc, ce que vous feriez est de le configurer avant pour utiliser l'outil:

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

rem Unix
$ export ASPNETCORE_ENVIRONMENT=Development
$ dotnet ...
92
Christian.K

Vous n'avez pas pour utiliser les variables d'environnement si vous ajustez la façon dont le WebHostBuilder traite sa configuration. Ceci est simplement la valeur par défaut pour dotnet new -t web. Par exemple, si vous souhaitez pouvoir définir l'environnement par défaut sur "développement" au lieu de la production et faciliter le remplacement de l'environnement dans la ligne de commande, vous pouvez le faire en modifiant le Program.cs code de cette ...

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

... dans 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 faisant cela, les variables d’environnement fonctionneraient toujours, mais vous pouvez les remplacer sur la ligne de commande sans aucune dépendance tierce, comme ceci:

dotnet run environment=development
dotnet run environment=staging

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

26
Technetium

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

ASPNETCORE_ENVIRONMENT=Development dotnet run

J'ai trouvé que c'était très bien pour les scripts NPM, mais je dois toujours l'appeler 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 multiplate-forme, vous pouvez utiliser cross-env:

npm install cross-env -D

Puis changez les scripts en:

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

Source: https://blogs.msdn.Microsoft.com/webdev/2017/02/14/building-single-page-applications-on-asp-net-core-with-javascriptservices/

Style 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", puis redémarrez votre invite de commande pour que les modifications prennent effet

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

13
emragins

Vérifier la documentation

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/"
    },   
  }
}
3
RouR

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

1
Bishop