2017-09-22 2 views
3

J'ai défini certaines valeurs dans appsettings.json pour des choses telles que les chaînes de connexion de bases de données, les emplacements webapi et autres qui sont différents pour les environnements de développement, de mise en scène et en direct.Définir automatiquement appsettings.json pour les environnements de développement et de publication dans le noyau asp.net?

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

Répondre

6

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 PRODUCTION 
    .AddJsonFile($"appsettings.production.json", optional: true) 
#else 
    .AddJsonFile($"appsettings.development.json", optional: true) 
#endif 
    .AddEnvironmentVariables(); 
    this.configuration = builder.Build(); 
} 
+0

typo dans le '# elsef', F à la fin ne devrait pas être là. (Je ne peux pas éditer puisque c'est seulement 1 caractère) – Nordes

+0

Fixe. Merci!!! – Dmitry

5

Vous pouvez utiliser des variables d'environnement et la classe ConfigurationBuilder dans votre constructeur Startup 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 fichier appsettings.xxx.json pour chaque environnement dont vous avez besoin, avec « xxx » étant le nom de l'environnement. Notez que vous pouvez mettre toutes les valeurs de configuration globales dans votre fichier "normal" appsettings.json et ne placer 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", peu importe). 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 transfert. La façon dont vous le faites dépend du type d'environnement.

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

+0

je cherché à utiliser des variables d'environnement , dans la section propriétés du projet -> déboguer, mais il n'y a pas de façon évidente comment cela va changer en fonction des paramètres du projet. Est-ce un autre fichier que je peux ajouter à mon projet pour le gérer? – tweetypi

+0

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

8

J'ai ajouté aperçu de l'environnement de travail, car il coûte mes quelques heures pour R & D.

First Ajouter une clé à votre fichier Launch.Json.

Voir ci-dessous snap, j'ai ajouté "Développement" comme mon environnement.

enter image description here

Puis Ajouter un fichier appSetting avec le nom même dans votre projet.

Ajout de capture, cherchez 2 fichiers différents nommés avec.

  • appSettings.Development.Json
  • appSetting.json

enter image description here

Et enfin configurer pour votre classe StartUp, comme ci-dessous.

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

Et enfin, je l'exécute à partir du terminal Comme ceci.

dotnet terme --environment "Développement"

où le développement est mon environnement.

1

Juste une mise à jour pour base .NET 2.0 utilisateurs, 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); 

    } 
}