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