Appsettings.json automatisch für Entwicklungs- und Release-Umgebungen im asp.net-Kern festlegen?

103

Ich habe in meinem einige Werte appsettings.jsonfür Dinge wie Datenbankverbindungszeichenfolgen, Webapi-Speicherorte und dergleichen definiert, die sich für Entwicklungs-, Staging- und Live-Umgebungen unterscheiden.

Gibt es eine Möglichkeit, mehrere appsettings.jsonDateien (wie appsettings.live.jsonusw. usw.) zu haben und die asp.net-App nur anhand der von ihr ausgeführten Build-Konfiguration zu wissen, welche verwendet werden soll?

Medikamente
quelle

Antworten:

31

Sie können die 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();
}
Dmitry
quelle
27
Sie sollten Ihre Umgebungsvariable in Ihrem MSBuild / TFS-Build festlegen. Die bedingte Kompilierung führt zu Fehlern für etwas, das in CI-Builds leicht zu handhaben ist. Dh .AddJsonFile ($ "appsettings. {Env.EnvironmentName} .json", optional: true)
Nick Turner
1
Siehe meine Antwort ( stackoverflow.com/a/50331886/1319086 ) für Umgebungsvariable
Jonatan Dragon
9
Diese Art von Ansatz erzwingt, dass der Code speziell für jede Umgebung neu kompiliert wird, sodass es unmöglich ist, ihn an anderer Stelle weiterzugeben / zu installieren.
tvdias
1
Frage war über "Wissen über Build-Konfiguration"
Dmitry
6
Dies sollte nicht als akzeptierte Antwort markiert werden - obwohl es sich um eine Lösung handelt, ist dies keine bewährte Methode.
Charleh
97

Ich habe Screenshots einer Arbeitsumgebung hinzugefügt, da es mich mehrere Stunden Forschung und Entwicklung gekostet hat.

  1. Fügen Sie Ihrer launch.jsonDatei zunächst einen Schlüssel hinzu .

    Siehe den folgenden Screenshot, den ich Developmentals meine Umgebung hinzugefügt habe.

    Deklaration der Umgebungsvariablen in launch.json

  2. Erstellen Sie dann in Ihrem Projekt eine neue appsettings.{environment}.jsonDatei, die den Namen der Umgebung enthält.

    Suchen Sie im folgenden Screenshot nach zwei verschiedenen Dateien mit den Namen:

    • appsettings.Development.Json
    • appSetting.json


    Projektansicht von JSON-Dateien für Appsettings

  3. Und schließlich konfigurieren Sie es für Ihre StartUpKlasse wie folgt:

    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. Und endlich können Sie es über die Befehlszeile wie folgt ausführen:

    dotnet run --environment "Development"
    

    Wo "Development"ist der Name meiner Umgebung?

Bharat
quelle
2
Versuchte dies und es funktioniert großartig. VS2017 zeigt sogar die verschiedenen Versionen wie unter der Basisdatei an. up Abstimmung.
Roberto
1
wie macht man es in Kern 2.2 als ihostingenvironment deprected ist
djack109
2
@ djack109 solltest du IWebHostEnvironmentstattdessen verwenden.
Alessandrocb
62

Update für .NET Core 3.0+

  1. Sie können Folgendes verwenden CreateDefaultBuilder, um automatisch ein Konfigurationsobjekt zu erstellen und an Ihre Startklasse zu übergeben:

    WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
    
    public class Startup
    {
        public Startup(IConfiguration configuration) // automatically injected
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }
        /* ... */
    }
    
  2. CreateDefaultBuilderEnthält automatisch die entsprechende Datei. Fügen Sie daher für jede Umgebung eine separate App-Einstellungsdatei hinzu:appsettings.Environment.json

    appsettings.env.json

  3. Legen Sie dann die ASPNETCORE_ENVIRONMENT Umgebungsvariable beim Ausführen / Debuggen fest

So legen Sie Umgebungsvariablen fest

Abhängig von Ihrer IDE gibt es einige Stellen, an denen Dotnet-Projekte traditionell nach Umgebungsvariablen suchen:

  • Gehen Sie für Visual Studio zu Projekt> Eigenschaften> Debug> Umgebungsvariablen:

    Visual Studio - Umgebungsvariablen

  • Bearbeiten Sie für Visual Studio-Code.vscode/launch.json > env:

    Visual Studio Code> Startumgebung

  • Mit Starteinstellungen , Bearbeiten Properties/launchSettings.json>environmentVariables :

    Einstellungen starten

    Welche kann auch aus der Symbolleiste in Visual Studio ausgewählt werden

    Dropdown-Liste Einstellungen starten

  • Verwenden Sie bei Verwendung der Dotnet-CLI die entsprechende Syntax für Festlegen von Umgebungsvariablen Ihr Betriebssystem

    Hinweis : Wenn eine App mit dotnet run gestartet wird , launchSettings.jsonwird sie gelesen, falls verfügbar, und die environmentVariablesEinstellungen in launchSettings.json überschreiben Umgebungsvariablen.

Wie funktioniert das Host.CreateDefaultBuilder?

.NET Core 3.0 wurde Host.CreateDefaultBuilderunter Plattformerweiterungen hinzugefügt , die eine Standardinitialisierung bereitstellen, IConfigurationdie die Standardkonfiguration für die App in der folgenden Reihenfolge bereitstellt:

  1. appsettings.jsonVerwenden des JSON-Konfigurationsanbieters .
  2. appsettings.Environment.jsonVerwenden des JSON-Konfigurationsanbieters . Zum Beispiel:
    • appsettings.Production.json oder
    • appsettings.Development.json
  3. App-Geheimnisse, wenn die App in der Entwicklungsumgebung ausgeführt wird.
  4. Umgebungsvariablen mit dem Konfigurationsanbieter für Umgebungsvariablen .
  5. Befehlszeilenargumente mit dem Befehlszeilenkonfigurationsanbieter .

Weiterführende Literatur - MS Docs

KyleMit
quelle
Danke, es ist gut, aber wie geht das mit dem Konsolenprozess (oder der Arbeitsprozessvorlage / dem Gerüst)?
hB0
45

In ASP.NET Core sollten Sie lieber Umgebungsvariablen verwenden, anstatt die Konfiguration für die richtige appsettings.json zu erstellen

  1. Klicken Sie mit der rechten Maustaste auf Ihr Projekt> Eigenschaften> Debug> Umgebungsvariablen

    Umgebungsvariablen

  2. ASP.NET Core verwendet die entsprechende Datei appsettings.json:

    Beispiel für Appsettings-Dateien im Solution Explorer

  3. Jetzt können Sie diese Umgebungsvariable folgendermaßen 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();
    }
    

Hinweis : Wenn Sie die Antwort von @ Dmitry verwenden , können Probleme auftreten, z. beim Überschreiben von appsettings.json-Werten in Azure.

Jonatan Drache
quelle
36

Sie können Umgebungsvariablen und die ConfigurationBuilderKlasse in Ihrem StartupKonstruktor folgendermaßen 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();
}

Anschließend erstellen Sie eine appsettings.xxx.jsonDatei für jede benötigte Umgebung, wobei "xxx" der Umgebungsname ist. Beachten Sie, dass Sie alle globalen Konfigurationswerte in Ihre "normale" appsettings.jsonDatei einfügen und nur die umgebungsspezifischen Elemente in diese neuen Dateien einfügen können.

Jetzt benötigen Sie nur noch eine Umgebungsvariable ASPNETCORE_ENVIRONMENTmit einem bestimmten Umgebungswert ("live", "staging", "Production" usw.). Sie können diese Variable in Ihren Projekteinstellungen für Ihre Entwicklungsumgebung angeben, und natürlich müssen Sie sie auch in Ihren Staging- und Produktionsumgebungen festlegen. Wie Sie es dort machen, hängt davon ab, um welche Umgebung es sich handelt.

UPDATE: Ich habe gerade festgestellt, dass Sie die appsettings.xxx.jsonbasierend 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 Methode "Umgebungsvariable" funktioniert jedoch und könnte genauso gut eine gute Alternative zu Ihrem Ansatz sein.

Onkel Toob
quelle
Ich habe die Verwendung von Umgebungsvariablen im Abschnitt Projekteigenschaften-> Debugging untersucht. Es gibt jedoch keine offensichtliche Möglichkeit, wie sich dies basierend auf den Projekteinstellungen ändern wird. Ist das eine andere Datei, die ich meinem Projekt hinzufügen kann, um damit umzugehen?
Medikamente
Das Festlegen der Variablen in den Projekteigenschaften funktioniert nur für die Verwendung in Ihrer Entwicklungsumgebung (wahrscheinlich Visual Studio). Sie müssen es je nach Umgebung (IIS, Azure) an einer anderen Stelle für Ihre bereitgestellten Apps festlegen. Ich würde nicht empfehlen, die Variable in einer Konfigurationsdatei festzulegen, da diese Datei möglicherweise auch bereitgestellt wird und dann die Serverwerte überschreibt.
Onkel Toob
Sie richten es in Build-Konfigurationen ein. Wenn es keine Build-Konfigurationsdatei gibt, führen sie diese manuell aus, sodass sie sie im (archaischen) Bereitstellungsprofil einrichten müssen
Nick Turner,
Ich habe mehrere Umgebungen wie Test, Staging und Produktion in Azure. Wo ändere ich die Variable ASPNETCORE_ENVIRONMENT, wenn ich den Release-Build der Webanwendung von VS nach Azure veröffentlichen möchte?
Frosty
Wir ändern die Variablen während der Bereitstellung nicht, sondern sie sind in die spezifische Umgebung integriert. In Azure können Sie diese Werte direkt in Ihrer App Service-Konfiguration unter "Anwendungseinstellungen" festlegen. Vergessen Sie nicht, sie als "Einstellungen für Bereitstellungssteckplätze" zu markieren, falls Sie mit mehreren Steckplätzen arbeiten.
Onkel Toob
29

Nur ein Update für Benutzer von .NET Core 2.0. Sie können die Anwendungskonfiguration nach dem Aufruf von 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);

   }
 }
umutesen
quelle
1
Wie wechseln Sie zwischen den verwendeten Umgebungen? Sollen in einer Konfigurationsdatei Änderungen vorgenommen werden? Ich verstehe, dass ich die URL, die ich verwenden möchte, wenn das Projekt unter Azure ausgeführt wird, zu appsettings.json hinzufügen muss, und die URL, die ich ausführen möchte, wenn sie lokal (mit F5) zu appsettings.Development.json ausgeführt wird . Ist das korrekt? Meine Zeichenfolge, die ich verwenden möchte, befindet sich in der Datei launchSettings.json, und ich bin mir nicht sicher, wie ich sie ändern soll, je nachdem, wo die Anwendung ausgeführt wird (oder ob sie überhaupt geändert werden soll).
DonkeyBanana
3
@DonkeyBanana Die Umgebung ist nichts anderes als eine Einstellung, die in den Projekteigenschaften angegeben ist. Klicken Sie in VS 2017 mit der rechten Maustaste auf das Projekt> Eigenschaften. Unter Debug sehen Sie die aktuelle Umgebung für den Schlüssel ASPNETCORE_ENVIRONMENT. Der Wert ist das, wofür ersetzt wird ctx.HostingEnvironment.EnvironmentName}. Wenn Sie diesen Wert in den Eigenschaften auf "Produktion" setzen, sucht das Projekt config.Production.jsonim Stammordner nach einer Datei. Für weitere Informationen sehen Sie bitte diesen Link
umutesen
Erstellt einen Error CS0266 Cannot implicitly convert type 'Microsoft.AspNetCore.Hosting.IWebHost' to 'Microsoft.AspNetCore.Hosting.IWebHostBuilder'. An explicit conversion exists (are you missing a cast?) in WebHost.CreateDefaultBuiler (...
Hecatonchires
Es ist erwähnenswert, dass hier angegeben ist , dass "AddJsonFile automatisch zweimal aufgerufen wird, wenn Sie einen neuen Host-Builder mit CreateDefaultBuilder initialisieren". Mit anderen Worten, es lädt bereits appSettings.json und lädt dann basierend auf Ihrer Umgebungskonfiguration appsettings. {Environment} .json
David Yates
13
  1. Erstellen Sie mehrere Dateien wie:appSettings.$(Configuration).json

    • appSettings.staging.json
    • appSettings.production.json
  2. Erstellen Sie ein Pre-Build-Ereignis für das Projekt, das die entsprechende Datei kopiert in appSettings.json:

    copy appSettings.$(Configuration).json appSettings.json
    
  3. Nur appSettings.jsonin Ihrem Config Builder verwenden:

    var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables();
    
    Configuration = builder.Build();
    
user3924036
quelle
Dies sollte eine akzeptierte Antwort sein. In komplizierten Fällen kann SlowCheetah verwendet werden.
Anton Krouglov
8

Sie können die Konfigurationsnamen als das hinzufügen ASPNETCORE_ENVIRONMENTder , launchSettings.jsonwie unten

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

Dies ist die Version, die für mich funktioniert, wenn ich eine Konsolen-App ohne Webseite verwende:

var builder = new ConfigurationBuilder()
             .SetBasePath(Directory.GetCurrentDirectory())
             .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
             .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true);

            IConfigurationRoot configuration = builder.Build();
            AppSettings appSettings = new AppSettings();
            configuration.GetSection("AppSettings").Bind(appSettings);
Nick Cordova
quelle
0

Die Datei .vscode / launch.json wird nur von Visual Studio sowie von der Datei /Properties/launchSettings.json verwendet. Verwenden Sie diese Dateien nicht in der Produktion.

Die Datei launchSettings.json:

  1. Wird nur auf der lokalen Entwicklungsmaschine verwendet.
  2. Wird nicht bereitgestellt.
  3. enthält Profileinstellungen.

    • In launchSettings.json festgelegte Umgebungswerte überschreiben die in der Systemumgebung festgelegten Werte

So verwenden Sie beispielsweise eine Datei 'appSettings.QA.json'. Sie können 'ASPNETCORE_ENVIRONMENT' verwenden. Folgen Sie den unteren Schritten.

  1. Fügen Sie eine neue Umgebungsvariable auf dem Hostcomputer hinzu und nennen Sie sie 'ASPNETCORE_ENVIRONMENT'. Setzen Sie den Wert auf 'QA'.
  2. Erstellen Sie eine Datei 'appSettings.QA.json' in Ihrem Projekt. Fügen Sie hier Ihre Konfiguration hinzu.
  3. Bereitstellung auf dem Computer in Schritt 1. Bestätigen Sie, dass 'appSettings.QA.json' bereitgestellt wurde.
  4. Laden Sie Ihre Website. Erwarten Sie, dass hier appSettings.QA.json verwendet wird.
Oks Xen
quelle