web-dev-qa-db-fra.com

Définition des variables d'environnement dans .net Core 2.0

J'essaie de configurer plusieurs environnements dans mon application .net core 2.0, voir mon code ci-dessous. 

Fichier de configuration (Launch.JSON)

"configurations": [
    {
        "name": ".NET Core Launch (web)",
        "type": "coreclr",
        "request": "launch",
        "preLaunchTask": "build",
        // If you have changed target frameworks, make sure to update the program path.
        "program": "${workspaceRoot}/my.api/bin/Debug/netcoreapp2.0/my.api.dll",
        "args": [],
        "cwd": "${workspaceRoot}/my.api",
        "stopAtEntry": false,
        "requireExactSource": false,
        "internalConsoleOptions": "openOnSessionStart",
        "launchBrowser": {
            "enabled": true,
            "args": "${auto-detect-url}",
            "windows": {
                "command": "cmd.exe",
                "args": "/C start ${auto-detect-url}"
            },
            "osx": {
                "command": "open"
            },
            "linux": {
                "command": "xdg-open"
            }
        },
        "env": {
            "ASPNETCORE_ENVIRONMENT": "Development"
        },
        "sourceFileMap": {
            "/Views": "${workspaceRoot}/Views"
        }
    },
    {
        "name": ".NET Core Attach",
        "type": "coreclr",
        "request": "attach",
        "processId": "${command:pickProcess}"
    }
]

Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

StartUp.cs

 public class Startup
{
    public IContainer ApplicationContainer { get; private set; }
    private IHostingEnvironment HostingEnvironment { get; set; }
    public IConfigurationRoot Configuration { get; }
    private string ConnectionString
    {
        get
        {
            return this.HostingEnvironment.IsDevelopment() ? Configuration.GetConnectionString("DefaultConnection") : Configuration.GetConnectionString("Production");
        }
    }
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()  
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.Development.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.Azuredev.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();

        this.HostingEnvironment = env;         

        System.Console.WriteLine(env.EnvironmentName); //here it always give me Production.
    }

Mon problème

J'ai essayé d'utiliser la ligne de commande comme dotnet run --environment "Development"

Donc, il devrait fonctionner sur Environnement de développement mais il fonctionne toujours avec Prodution , (regardez j'ai ajouté console.writeline dans mon startup.cs)

Ce qui est étrange, c’est que si j’utilise F5 pour déboguer, il fonctionne parfaitement avec Development Environment.

8
Bharat

Vous pouvez mettre à jour votre launchsettings.json pour inclure un profil 'Développement' puis exécuter:

dotnet run --launch-profile "Development"

Pour plus de détails sur la configuration du fichier launchSettings.json, voir Utilisation de plusieurs environnements

Notez que commandName devrait probablement être "Project" (je n'ai pas vraiment essayé autant). Exemple launchSettings.json comme suit:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:19882/",
      "sslPort": 0
    }
  },
  "profiles": {
    "Development": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}
8
CalC

Enfin je l'ai fait ..

Regardons comment j'ai réalisé cela.

  1. J'ai ajouté tous les paramètres de mon profil dans launchSettings.JSON.
  2. Program.cs reste identique à ce que j'ai ajouté dans ma question.
  3. Mise à jour startup.cs (voir ci-dessous)
  4. La CLI pour l’exécuter via un terminal est également différente.

Voyons d'abord ma structure de projet.

 enter image description here

code dans mon launchSettings.json

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:40088/",
      "sslPort": 0
    }
  },
  "profiles": {
    "Development": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "Azuredev": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Azuredev"
      }
    }
  }
}

Code dans launch.json

{     
"version": "0.2.0",
"configurations": [
        {
            "name": ".NET Core Launch (web)",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build",
            // If you have changed target frameworks, make sure to update the program path.
            "program": "${workspaceRoot}/my.api/bin/Debug/netcoreapp2.0/my.api.dll",
            "args": [],
            "cwd": "${workspaceRoot}/my.api",
            "stopAtEntry": false,
            "requireExactSource": false,
            "internalConsoleOptions": "openOnSessionStart",
            "launchBrowser": {
                "enabled": true,
                "args": "${auto-detect-url}",
                "windows": {
                    "command": "cmd.exe",
                    "args": "/C start ${auto-detect-url}"
                },
                "osx": {
                    "command": "open"
                },
                "linux": {
                    "command": "xdg-open"
                }
            },
            "sourceFileMap": {
                "/Views": "${workspaceRoot}/Views"
            }
        },
        {
            "name": ".NET Core Attach",
            "type": "coreclr",
            "request": "attach",
            "processId": "${command:pickProcess}"
        }
    ]
}

startup.cs

    public IConfigurationRoot Configuration { get; }

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()  
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();

        this.HostingEnvironment = env;        
    }

Après tout cela, mon API fonctionne correctement avec l’option de débogage F5 ainsi que le terminal CLI.

Pour lancer l'application à partir de la ligne de commande, utilisez ces mots-clés.

dotnet run --launch-profile "Développement"

OU 

dotnet run --launch-profile "Azuredev"

2
Bharat

dotnet run --environment n'a aucun effet sur la variable d'environnement ASPNETCORE_ENVIRONMENT, voir ce problème .

Voici une instruction détaillée sur la façon de changer d’environnement de plusieurs manières: https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/environments

Par exemple, vous pouvez l'exécuter à partir d'une ligne de commande (avant dotnet run): set ASPNETCORE_ENVIRONMENT=Development

1
astef

Vous pouvez définir l'environnement à l'aide de la commande suivante dans le terminal de commande.

setx ASPNETCORE_ENVIRONMENT "Environment_Name"

Le nom de l'environnement peut être Développement, Mise en scène ou Production.

Notez que la variable d'environnement n'est pas définie dans la fenêtre ouverte actuelle. Vous devrez ouvrir une nouvelle commande Invite pour voir l'environnement mis à jour. Il est également possible de définir des variables système (plutôt que des variables utilisateur) si vous ouvrez une invite de commande administrative et ajoutez le commutateur/M

Pour référence

1
Akbar Badhusha