web-dev-qa-db-fra.com

Comment transformer appsettings.json en projet MVC .NET Core?

J'ai ajouté des fichiers de configuration json supplémentaires à mon projet

appsettings.DEV.json
appsettings.QA.json

et les a chargés dans la fonction Startup basée sur l'environnement:

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

Et je comprends comment changer l'environnement: modifiez la valeur du ASPNETCORE_ENVIRONMENT variable d'environnement dans les propriétés du projet. Cependant, il ne semble pas être possible de spécifier différentes variables d'environnement en fonction de la configuration, la liste déroulante est étiquetée "N/A" et désactivée.

La seule option que je vois est de modifier manuellement la valeur de la variable d'environnement, pour changer les paramètres d'application utilisés. Je suis sûr qu'il existe un moyen de le faire automatiquement, sinon comment utiliseriez-vous CI? (autre que l'utilisation d'un script pour changer la variable d'environnement, il doit y avoir un moyen plus simple).

L'objectif ici est de configurer des builds automatisés et une intégration continue pour trois environnements: DEV, QA et PROD. DEV et QA sont sur la même machine , donc définir la variable d'environnement qui spécifie l'environnement manuellement n'est pas une option.

Project Properties : Debug section

15
James Wierzba

J'ai trouvé une solution à partir de la réponse de Tsengs mais je souhaite la décrire ici pour plus de clarté. La solution se trouve dans la réponse à une autre question, mais la question est très différente (et j'ai également développé la réponse), donc je ne pense pas que cette question doive être marquée comme doublon.

La réponse est ici

La solution consiste à configurer différentes valeurs de variables d'environnement sur chaque site IIS pour la clé ASPNETCORE_ENVIRONMENT

Les étapes pour ce faire sont les suivantes:

  1. Accédez à votre application dans IIS et choisissez Configuration Editor.
  2. Sélectionnez Configuration Editor
  3. Choisissez system.webServer/aspNetCore (RC2 et RTM) ou system.webServer/httpPlatform (RC1) dans la zone de liste déroulante Section
  4. Choisissez Applicationhost.config ... dans la zone de liste déroulante From.
  5. Cliquez sur l'élément enviromentVariables et ouvrez la fenêtre d'édition.
  6. Définissez vos variables d'environnement.
  7. Fermez la fenêtre et cliquez sur Appliquer.
  8. Terminé

Vous pouvez également modifier votre applicationHost.config fichier (normalement situé à C:\Windows\System32\inetsrv\config\applicationHost.config

Et ajoutez l'entrée suivante sous la racine <Configuration> tag, où "mon-site-iis" est le nom de votre site IIS.

<location path="my-iis-site">
    <system.webServer>
        <aspNetCore>
            <environmentVariables>
                <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="DEV" />
            </environmentVariables>
        </aspNetCore>
    </system.webServer>
</location>
10
James Wierzba

Déterminer EnvironmentName à partir du type de build

Pour tous ceux qui souhaitent définir l'EnvironmentName en fonction du type de build, il existe la fonction .UseEnvironment(environmentName) on WebHostBuilder (trouvée dans le programme principal).

Tant que les symboles de compilation appropriés sont définis par rapport aux configurations de génération dans votre projet, vous pouvez faire quelque chose comme ceci pour déterminer le EnvironmentName:

public static void Main(string[] args)
{
    string environmentName;
#if DEBUG
    environmentName = "Development";
#Elif STAGING
    environmentName = "Staging";
#Elif RELEASE
    environmentName = "Production";
#endif

    var Host = new WebHostBuilder()
        .UseKestrel()
        .UseEnvironment(environmentName)
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .UseApplicationInsights()
        .Build();

    Host.Run();
}
17
Carl Sharman

Si vous utilisez le code par défaut dans program.cs, vous n'avez rien d'autre à faire que de créer les deux fichiers dans le projet.

Le code par défaut dans program.cs Ressemble à ceci:

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

Voici ce que fait code :

public static IWebHostBuilder CreateDefaultBuilder(string[] args)
        {
            var builder = new WebHostBuilder();

            ...

            builder.ConfigureAppConfiguration((hostingContext, config) =>
                {
                    var env = hostingContext.HostingEnvironment;

                    config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                          .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

        ...

            return builder;
        }

Donc, tout ce que vous avez à faire est de créer le appsettings.YourEnvionronmentalVariable.json Et il sera automatiquement transformé.

Remarque supplémentaire: pour que les deux fichiers fusionnent réellement, utilisez cette syntaxe:

var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();

ne pas:

var appSettings = new AppSettings();
Configuration.Bind("AppSettings", appSettings);
return appSettings;

Ce dernier ne restituera pas les données fusionnées.

Merci à Shawn Wildermuth pour ceci

8
Greg Gum

Si vous utilisez Azure, ajoutez ASPNETCORE_ENVIRONMENT avec la valeur correspondante aux paramètres d'application dans le côté de la webapp, qui récupérera ensuite les paramètres d'application corrects. {Value} .json file

0
sensei

La boîte de dialogue que vous avez liée dans l'image sert uniquement à configurer "launchSettings.json". Ce fichier n'est pas utilisé par votre application .

Il est uniquement utilisé par Visual Studio pour définir l'environnement et ouvrir une URL dans le navigateur lorsque vous appuyez sur F5 et rien d'autre.

Lorsque vous souhaitez changer d’environnement, vous devez configurer une variable d’environnement avant de lancer. La procédure à suivre dépend de votre environnement.

Windows (ligne de commande, cmd.exe)

setx ASPNETCORE_ENVIRONMENT "Development"

Windows (Powershell)

$Env:ASPNETCORE_ENVIRONMENT = "Development"

Linux

export ASPNETCORE_ENVIRONMENT="Development"

Linux (définissez-le pour une seule commande)

ASPNETCORE_ENVIRONMENT="Development" dotnet run

Mise à jour concernant le commentaire

Oui, il est spécifique à la machine (sauf pour Linux, que vous pouvez faire par commande). Cependant, dans IIS vous pouvez le faire aussi soit via différents pools d'applications ou en suivant ceci répond instructions pour l'ajouter à IIS

0
Tseng