218 votes

Définir automatiquement appsettings.json pour les environnements dev et release dans asp.net core ?

J'ai défini certaines valeurs dans mon appsettings.json pour des éléments tels que les chaînes de connexion à la base de données, les emplacements des webapis et autres, qui sont différents pour les environnements de développement, de simulation et réels.

Existe-t-il un moyen d'avoir plusieurs appsettings.json (comme appsettings.live.json ) et que l'application asp.net " sache " laquelle utiliser en fonction de la configuration de construction qu'elle exécute ?

154voto

Bharat Points 1769

J'ai ajouté des captures d'écran d'un environnement de travail, parce que cela m'a coûté plusieurs heures de recherche et développement.

  1. Tout d'abord, ajoutez une clé à votre launch.json fichier.

    Voir la capture d'écran ci-dessous, j'ai ajouté Development comme mon environnement.

    Declaration of the environment variable in launch.json

  2. Ensuite, dans votre projet, créez un nouveau appsettings.{environment}.json qui inclut le nom de l'environnement.

    Dans la capture d'écran suivante, recherchez deux fichiers différents avec les noms :

    • appsettings.Development.Json
    • appSetting.json

    Project view of appsettings JSON files

  3. Et enfin, configurez-le à votre StartUp comme ceci :

    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)
            .AddEnvironmentVariables();
    
        Configuration = builder.Build();
    }
  4. Et enfin, vous pouvez le lancer depuis la ligne de commande comme ceci :

    dotnet run --environment "Development"

    "Development" est le nom de mon environnement.

2 votes

J'ai essayé ça et ça marche très bien. VS2017 affiche même les différentes versions comme sous le fichier de base. up vote.

1 votes

Comment faire dans le noyau 2.2 car ihostingenvironment est déprogrammé ?

4 votes

@djack109 vous devriez utiliser IWebHostEnvironment à la place.

63voto

walkerbox Points 745

Dans ASP.NET Core, vous devriez plutôt utiliser les variables d'environnement au lieu de la configuration de construction pour les appsettings.json appropriés.

  1. Cliquez à droite sur votre projet > Propriétés > Debug > Variables d'environnement.

    environment variables

  2. ASP.NET Core utilisera le fichier appsettings.json approprié :

    example of appsettings files in solution explorer

  3. Maintenant vous pouvez utiliser cette variable d'environnement comme ceci :

    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)
            .AddEnvironmentVariables();
    
        Configuration = builder.Build();
    }

Note : Si vous utilisez Réponse de @Dmitry vous pouvez rencontrer des problèmes, par exemple lorsque Remplacer les valeurs de appsettings.json sur Azure.

42voto

Onkel Toob Points 1523

Vous pouvez utiliser les variables d'environnement et la fonction ConfigurationBuilder dans votre Startup Constructeur comme ceci :

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)
    .AddEnvironmentVariables();
    this.configuration = builder.Build();
}

Ensuite, vous créez un appsettings.xxx.json pour chaque environnement dont vous avez besoin, "xxx" étant le nom de l'environnement. Notez que vous pouvez placer toutes les valeurs de configuration globale dans votre fichier "normal". appsettings.json et ne mettez que les éléments spécifiques à l'environnement dans ces nouveaux fichiers.

Maintenant, vous avez seulement besoin d'une variable d'environnement appelée ASPNETCORE_ENVIRONMENT avec une valeur d'environnement spécifique ("live", "staging", "production", etc.). Vous pouvez spécifier cette variable dans les paramètres de votre projet pour votre environnement de développement, et bien sûr, vous devez également la définir dans vos environnements de production et de stockage. La façon dont vous le faites dépend du type d'environnement dont il s'agit.

UPDATE : Je viens de réaliser que vous voulez choisir le appsettings.xxx.json en fonction de votre configuration de construction . Cela ne peut être réalisé avec la solution que je propose et je ne sais pas s'il existe un moyen de le faire. La méthode de la "variable d'environnement", cependant, fonctionne et pourrait aussi bien être une bonne alternative à votre approche.

0 votes

J'ai envisagé d'utiliser des variables d'environnement, dans la section Propriétés du projet->debug, mais il n'y a pas de moyen évident pour que cela change en fonction des paramètres du projet. Y a-t-il un autre fichier que je peux ajouter à mon projet pour le gérer ?

0 votes

La définition de la variable dans les propriétés du projet ne fonctionnera que pour l'utiliser dans votre environnement de développement (probablement Visual Studio). Vous devrez la définir ailleurs pour vos applications déployées, en fonction de l'environnement spécifique (IIS, Azure). Je ne recommande pas de définir la variable dans un fichier de configuration, car ce fichier pourrait être déployé également et remplacer les valeurs du serveur.

0 votes

Vous le définissez dans les configurations de construction. S'il n'y a pas de fichier de configuration de la construction, c'est qu'il s'agit d'une opération manuelle, et il faut donc la configurer dans le profil de déploiement (archaïque).

33voto

Dmitry Points 7136

Vous pouvez utiliser la compilation conditionnelle :

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
#if SOME_BUILD_FLAG_A
    .AddJsonFile($"appsettings.flag_a.json", optional: true)
#else
    .AddJsonFile($"appsettings.no_flag_a.json", optional: true)
#endif
    .AddEnvironmentVariables();
    this.configuration = builder.Build();
}

32 votes

Vous devez définir votre variable d'environnement dans votre construction MSBuild/TFS. La compilation conditionnelle conduit à des erreurs pour quelque chose qui est facilement géré dans les builds CI. Par exemple, .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional : true)

1 votes

Voir ma réponse ( stackoverflow.com/a/50331886/1319086 ) pour la variable d'environnement

14 votes

Ce type d'approche oblige le code à être recompilé spécifiquement pour chaque environnement, ce qui le rend impossible à redistribuer/installer ailleurs.

33voto

Esen Points 627

Juste une mise à jour pour les utilisateurs de .NET core 2.0, vous pouvez spécifier la configuration de l'application après l'appel à CreateDefaultBuilder :

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

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

   static void ConfigConfiguration(WebHostBuilderContext ctx, IConfigurationBuilder config)
   {
            config.SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("config.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"config.{ctx.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);

   }
 }

2 votes

Comment passer d'un environnement à l'autre ? Y a-t-il des changements à faire dans un fichier de configuration ? J'ai cru comprendre que je devais ajouter l'URL que je souhaite utiliser lorsque le projet s'exécute sur Azure dans le fichier appsettings.json et l'URL que je veux exécuter lorsqu'il est exécuté localement (par F5) à appsettings.Development.json . Est-ce correct ? La chaîne de caractères que je veux utiliser se trouve dans le fichier launchSettings.json et je ne sais pas trop comment la modifier en fonction de l'endroit où l'application est exécutée (ou si elle est censée être modifiée tout court).

4 votes

@DonkeyBanana L'environnement n'est rien d'autre qu'un paramètre spécifié dans les propriétés du projet. Dans VS 2017, faites un clic droit sur le projet > propriétés. Sous debug, vous verrez l'environnement actuel pour la clé. ASPNETCORE_ENVIRONMENT . La valeur est ce qui sera remplacé pour ctx.HostingEnvironment.EnvironmentName} . Donc, si vous définissez cette valeur dans les propriétés sur 'Production', le projet cherchera config.Production.json dans le dossier racine. Pour plus d'informations, veuillez consulter cette page lien

0 votes

Crée un Error CS0266 Cannot implicitly convert type 'Microsoft.AspNetCore.Hosting.IWebHost' to 'Microsoft.AspNetCore.Hosting.IWebHostBuilder'. An explicit conversion exists (are you missing a cast?) dans WebHost.CreateDefaultBuiler(...)

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