web-dev-qa-db-de.com

Appsettings.json für asp- und release-Umgebungen in asp.net core automatisch festlegen?

In appsettings.json habe ich einige Werte für Datenbankverbindungszeichenfolgen, Webapi-Speicherorte und dergleichen definiert, die sich in Entwicklungs-, Staging- und Live-Umgebungen unterscheiden.

Gibt es eine Möglichkeit, mehrere appsettings.json-Dateien (wie appsettings.live.json usw.) zu haben und die asp.net-App nur zu wissen, welche sie basierend auf der ausgeführten Build-Konfiguration verwenden soll?

28
tweetypi

Sie können bedingte Kompilierung verwenden:

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

Ich habe eine Momentaufnahme der Arbeitsumgebung hinzugefügt, da dies einige Stunden für Forschung und Entwicklung kostet.

Fügen Sie zuerst den Schlüssel zu Ihrer Launch.Json-Datei hinzu.

Siehe unten, ich habe "Development" als meine Umgebung hinzugefügt.

 enter image description here

Fügen Sie dann in Ihrem Projekt eine appSetting-Datei mit gleichem Namen hinzu.

Snap hinzugefügt, suchen Sie nach 2 verschiedenen Dateien mit dem Namen.

  • appSettings.Development.Json
  • appSetting.json

 enter image description here

Und schließlich konfigurieren Sie es für Ihre StartUp-Klasse, wie unten.

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

Und endlich renne ich es vom Terminal aus.

dotnet run --environment "Entwicklung"

wo Entwicklung meine Umgebung ist.

38
Bharat

Nur ein Update für .NET Core 2.0-Benutzer. Nach dem Aufruf von CreateDefaultBuilder können Sie die Anwendungskonfiguration angeben:

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

Sie können Umgebungsvariablen und die ConfigurationBuilder-Klasse in Ihrem Startup-Konstruktor wie folgt verwenden:

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

Dann erstellen Sie eine appsettings.xxx.json-Datei für jede gewünschte Umgebung, wobei "xxx" der Umgebungsname ist. Beachten Sie, dass Sie alle globalen Konfigurationswerte in Ihre "normale" appsettings.json-Datei und nur das umgebungsspezifische Material in diese neuen Dateien einfügen können.

Jetzt benötigen Sie nur noch eine Umgebungsvariable namens ASPNETCORE_ENVIRONMENT mit einem bestimmten Umgebungswert ("live", "staging", "production", wie auch immer). Sie können diese Variable in Ihren Projekteinstellungen für Ihre Entwicklungsumgebung angeben, und Sie müssen sie natürlich auch in Ihren Bereitstellungs- und Produktionsumgebungen festlegen. Die Art und Weise, wie Sie es dort tun, hängt von der Art der Umgebung ab.

UPDATE: Ich habe gerade festgestellt, dass Sie den appsettings.xxx.json basierend auf Ihrer aktuellen build-Konfiguration auswählen möchten. Dies kann mit meiner vorgeschlagenen Lösung nicht erreicht werden, und ich weiß nicht, ob es einen Weg gibt, dies zu tun. Die "Umgebungsvariable" ist jedoch eine gute Alternative zu Ihrem Ansatz.

16
Onkel Toob

In ASP.NET Core sollten Sie statt der Build-Konfiguration eher EnvironmentVariables verwenden, um die Datei appsettings.json zu erstellen

Klicken Sie mit der rechten Maustaste auf Ihr Projekt> Eigenschaften> Debuggen> Umgebungsvariablen

 enter image description here

ASP.NET Core nimmt die richtige Datei appsettings.json.

Jetzt können Sie diese Umgebungsvariable wie folgt verwenden:

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

Wenn Sie es auf @Dmitry machen, werden Sie Probleme haben, z. beim Überschreiben von appsettings.json-Werten in Azure.

6
walkerbox

Sie können den Konfigurationsnamen wie folgt als ASPNETCORE_ENVIRONMENT im launchSettings.json hinzufügen

  "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.Erstellen Sie mehrere appSettings. $ (Configuration) .json wie AppSettings.staging.json AppSettings.production.json

2. Erstellen Sie ein Pre-Build-Ereignis für das Projekt, das die entsprechende Datei in appSettings.json wie folgt kopiert

appSettings kopieren. $ (Configuration) .json appSettings.json

3.Verwenden Sie in Ihrem Config Builder nur appSettings.json 

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

        Configuration = builder.Build();
0
user3924036