web-dev-qa-db-fra.com

Définir automatiquement appsettings.json pour les environnements de développement et de publication dans le noyau asp.net?

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 Webapi, etc., qui sont différentes pour les environnements de développement, de transfert et en direct.

Existe-t-il un moyen d'avoir plusieurs fichiers appsettings.json (tels que appsettings.live.json, etc., etc.) et de laisser l'application asp.net "savoir" lequel, à utiliser, en fonction de la configuration de construction en cours d'exécution?

28
tweetypi

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

J'ai ajouté un instantané de l'environnement de travail, car cela me coûte plusieurs heures de R & D.

Ajoutez d'abord la clé à votre fichier Launch.Json.

Voir ci-dessous, j'ai ajouté "Development" comme environnement.

 enter image description here

Ajoutez ensuite un fichier appSetting avec le même nom dans votre projet.

Snap ajouté, recherchez 2 fichiers différents nommés avec.

  • appSettings.Development.Json
  • appSetting.json

 enter image description here

Et enfin, configurez-le dans votre classe de démarrage, 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 le lance depuis le terminal Comme ça.

dotnet run --environment "Development"

où le développement est mon environnement.

38
Bharat

Juste une mise à jour pour les utilisateurs .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);

   }
 }
19
Umut Esen

Vous pouvez utiliser les 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, "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.

Désormais, vous n'avez besoin que 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. Vous devez bien entendu également la définir dans vos environnements de transfert et de production. La façon dont vous le faites dépend du type d’environnement.

UPDATE: Je viens de réaliser que vous voulez choisir le appsettings.xxx.json en fonction de votre configuration actuelle build. Cela ne peut pas être réalisé avec la solution proposée et je ne sais pas s’il est possible de le faire. La "variable d'environnement", cependant, fonctionne et pourrait tout aussi bien être une bonne alternative à votre approche.

16
Onkel Toob

Dans ASP.NET Core, vous devriez plutôt utiliser EnvironmentVariables plutôt que la configuration de construction pour appsettings.json approprié.

Faites un clic droit sur votre projet> Propriétés> Déboguer> Variables d'environnement

 enter image description here

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

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

Si vous le faites à la manière de Dmitry, vous aurez des problèmes, par exemple. lors de la substitution de valeurs appsettings.json sur Azure.

6
walkerbox

Vous pouvez ajouter le nom de la configuration en tant que ASPNETCORE_ENVIRONMENT dans le launchSettings.json comme ci-dessous.

  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:58446/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "environmentVariables": {
        ASPNETCORE_ENVIRONMENT": "$(Configuration)"
      }
    }
  }
3
Fleaca Dan

1.Créez plusieurs appSettings. $ (Configuration) .jsons comme AppSettings.staging.json AppSettings.production.json

2.Créez un événement de pré-génération sur le projet qui copie le fichier correspondant dans appSettings.json comme ceci

copier appSettings. $ (Configuration) .json appSettings.json

3.Utilisez uniquement appSettings.json dans votre Config Builder 

var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();
0
user3924036