Zdefiniowałem w moich wartościach appsettings.json
takie rzeczy, jak parametry połączenia z bazą danych, lokalizacje webapi i tym podobne, które są różne dla środowisk programistycznych, tymczasowych i na żywo.
Czy istnieje sposób, aby mieć wiele appsettings.json
plików (np. appsettings.live.json
Itp.) I mieć aplikację asp.net po prostu „wiedzieć”, którego użyć na podstawie uruchomionej konfiguracji kompilacji?
c#
asp.net-core
appsettings
meds
źródło
źródło
Dodałem zrzuty ekranu ze środowiska pracy, ponieważ kosztowało mnie to kilka godzin badań i rozwoju.
Najpierw dodaj klucz do swojego
launch.json
pliku.Zobacz poniższy zrzut ekranu, dodałem
Development
jako moje środowisko.Następnie w swoim projekcie utwórz nowy
appsettings.{environment}.json
plik zawierający nazwę środowiska.Na poniższym zrzucie ekranu poszukaj dwóch różnych plików o nazwach:
appsettings.Development.Json
appSetting.json
Na koniec skonfiguruj go do swojej
StartUp
klasy w następujący sposób: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(); }
I w końcu możesz uruchomić go z wiersza poleceń w następujący sposób:
dotnet run --environment "Development"
gdzie
"Development"
jest nazwa mojego środowiska.źródło
IWebHostEnvironment
zamiast tego.Aktualizacja dla .NET Core 3.0+
Możesz użyć,
CreateDefaultBuilder
który automatycznie zbuduje i przekaże obiekt konfiguracyjny do Twojej klasy startowej:public class Startup { public Startup(IConfiguration configuration) // automatically injected { Configuration = configuration; } public IConfiguration Configuration { get; } /* ... */ }
CreateDefaultBuilder
automatycznie dołącza odpowiedni plik, więc dodaj oddzielny plik appsettings dla każdego środowiska:appsettings.Environment.json
Następnie ustaw
ASPNETCORE_ENVIRONMENT
zmienną środowiskową podczas uruchamiania / debugowaniaJak ustawić zmienne środowiskowe
W zależności od IDE istnieje kilka miejsc, w których projekty dotnet tradycyjnie szukają zmiennych środowiskowych:
W przypadku programu Visual Studio przejdź do projektu> właściwości> debugowania> zmienne środowiskowe:
W przypadku programu Visual Studio Code edytuj
.vscode/launch.json
>env
:Korzystając z Ustawień uruchamiania , edytuj
Properties/launchSettings.json
>environmentVariables
:Które można również wybrać z paska narzędzi w programie Visual Studio
Korzystając z interfejsu wiersza polecenia dotnet , użyj odpowiedniej składni do ustawiania zmiennych środowiskowych dla systemu operacyjnego
Jak
Host.CreateDefaultBuilder
działa?.NET Core 3.0 dodane w
Host.CreateDefaultBuilder
ramach rozszerzeń platformy, które zapewnią domyślną inicjalizację,IConfiguration
która zapewnia domyślną konfigurację aplikacji w następującej kolejności:Dalsza lektura - MS Docs
źródło
W ASP.NET Core należy raczej używać zmiennych środowiskowych zamiast konfiguracji kompilacji dla prawidłowego appsettings.json
Kliknij prawym przyciskiem myszy projekt> Właściwości> Debugowanie> Zmienne środowiskowe
ASP.NET Core użyje odpowiedniego pliku appsettings.json:
Teraz możesz użyć tej zmiennej środowiskowej w następujący sposób:
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(); }
źródło
Możesz użyć zmiennych środowiskowych i
ConfigurationBuilder
klasy w swoimStartup
konstruktorze w następujący sposób: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(); }
Następnie tworzysz
appsettings.xxx.json
plik dla każdego potrzebnego środowiska, gdzie „xxx” to nazwa środowiska. Pamiętaj, że możesz umieścić wszystkie globalne wartości konfiguracyjne w swoim „normalnym”appsettings.json
pliku i umieścić w tych nowych plikach tylko elementy specyficzne dla środowiska.Teraz potrzebujesz tylko zmiennej środowiskowej wywoływanej
ASPNETCORE_ENVIRONMENT
z określoną wartością środowiskową („na żywo”, „staging”, „produkcja”, cokolwiek). Możesz określić tę zmienną w ustawieniach projektu dla swojego środowiska programistycznego i oczywiście musisz ustawić ją również w środowisku pomostowym i produkcyjnym. Sposób, w jaki to robisz, zależy od tego, jakie to jest środowisko.AKTUALIZACJA: Właśnie zdałem sobie sprawę, że chcesz wybrać na
appsettings.xxx.json
podstawie bieżącej konfiguracji kompilacji . Nie da się tego osiągnąć za pomocą proponowanego przeze mnie rozwiązania i nie wiem, czy jest na to sposób. Jednak metoda „zmiennych środowiskowych” działa i równie dobrze może być dobrą alternatywą dla twojego podejścia.źródło
Tylko aktualizacja dla użytkowników .NET core 2.0, możesz określić konfigurację aplikacji po wywołaniu
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); } }
źródło
ASPNETCORE_ENVIRONMENT
. Wartość jest tym, co zostanie zastąpionectx.HostingEnvironment.EnvironmentName}
. Jeśli więc ustawisz tę wartość we właściwościach na „Produkcja”, projekt będzie szukałconfig.Production.json
pliku w folderze głównym. Aby uzyskać więcej informacji, kliknij ten linkError CS0266 Cannot implicitly convert type 'Microsoft.AspNetCore.Hosting.IWebHost' to 'Microsoft.AspNetCore.Hosting.IWebHostBuilder'. An explicit conversion exists (are you missing a cast?)
w WebHost.CreateDefaultBuiler (...Utwórz wiele plików, takich jak:
appSettings.$(Configuration).json
appSettings.staging.json
appSettings.production.json
Utwórz wydarzenie przed kompilacją w projekcie, które kopiuje odpowiedni plik do
appSettings.json
:Używaj tylko
appSettings.json
w swoim Config Builder:var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); Configuration = builder.Build();
źródło
Można dodać nazwę konfiguracji jak
ASPNETCORE_ENVIRONMENT
wlaunchSettings.json
jak poniżej"iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:58446/", "sslPort": 0 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "environmentVariables": { ASPNETCORE_ENVIRONMENT": "$(Configuration)" } } }
źródło
Ta wersja działa u mnie podczas korzystania z aplikacji konsoli bez strony internetowej:
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);
źródło
Plik .vscode / launch.json jest używany tylko przez program Visual Studio, a także plik /Properties/launchSettings.json. Nie używaj tych plików w środowisku produkcyjnym.
Plik launchSettings.json:
zawiera ustawienia profilu.
Na przykład, aby użyć pliku „appSettings.QA.json”. Możesz użyć „ASPNETCORE_ENVIRONMENT”. Wykonaj poniższe kroki.
źródło