J'ai ajouté des fichiers de configuration json supplémentaires à mon projet
appsettings.DEV.json
appsettings.QA.json
et les a chargés dans la fonction Startup
basée sur l'environnement:
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, reloadOnChange: true);
...
Et je comprends comment changer l'environnement: modifiez la valeur du ASPNETCORE_ENVIRONMENT
variable d'environnement dans les propriétés du projet. Cependant, il ne semble pas être possible de spécifier différentes variables d'environnement en fonction de la configuration, la liste déroulante est étiquetée "N/A" et désactivée.
La seule option que je vois est de modifier manuellement la valeur de la variable d'environnement, pour changer les paramètres d'application utilisés. Je suis sûr qu'il existe un moyen de le faire automatiquement, sinon comment utiliseriez-vous CI? (autre que l'utilisation d'un script pour changer la variable d'environnement, il doit y avoir un moyen plus simple).
L'objectif ici est de configurer des builds automatisés et une intégration continue pour trois environnements: DEV, QA et PROD. DEV et QA sont sur la même machine , donc définir la variable d'environnement qui spécifie l'environnement manuellement n'est pas une option.
J'ai trouvé une solution à partir de la réponse de Tsengs mais je souhaite la décrire ici pour plus de clarté. La solution se trouve dans la réponse à une autre question, mais la question est très différente (et j'ai également développé la réponse), donc je ne pense pas que cette question doive être marquée comme doublon.
La réponse est ici
La solution consiste à configurer différentes valeurs de variables d'environnement sur chaque site IIS pour la clé ASPNETCORE_ENVIRONMENT
Les étapes pour ce faire sont les suivantes:
Configuration Editor
.Configuration Editor
system.webServer/aspNetCore
(RC2 et RTM) ou system.webServer/httpPlatform
(RC1) dans la zone de liste déroulante Section
Applicationhost.config ...
dans la zone de liste déroulante From
.enviromentVariables
et ouvrez la fenêtre d'édition.Vous pouvez également modifier votre applicationHost.config
fichier (normalement situé à C:\Windows\System32\inetsrv\config\applicationHost.config
Et ajoutez l'entrée suivante sous la racine <Configuration>
tag, où "mon-site-iis" est le nom de votre site IIS.
<location path="my-iis-site">
<system.webServer>
<aspNetCore>
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="DEV" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</location>
Pour tous ceux qui souhaitent définir l'EnvironmentName en fonction du type de build, il existe la fonction .UseEnvironment(environmentName)
on WebHostBuilder
(trouvée dans le programme principal).
Tant que les symboles de compilation appropriés sont définis par rapport aux configurations de génération dans votre projet, vous pouvez faire quelque chose comme ceci pour déterminer le EnvironmentName:
public static void Main(string[] args)
{
string environmentName;
#if DEBUG
environmentName = "Development";
#Elif STAGING
environmentName = "Staging";
#Elif RELEASE
environmentName = "Production";
#endif
var Host = new WebHostBuilder()
.UseKestrel()
.UseEnvironment(environmentName)
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
Host.Run();
}
Si vous utilisez le code par défaut dans program.cs, vous n'avez rien d'autre à faire que de créer les deux fichiers dans le projet.
Le code par défaut dans program.cs
Ressemble à ceci:
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
Voici ce que fait code :
public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
var builder = new WebHostBuilder();
...
builder.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
...
return builder;
}
Donc, tout ce que vous avez à faire est de créer le appsettings.YourEnvionronmentalVariable.json
Et il sera automatiquement transformé.
Remarque supplémentaire: pour que les deux fichiers fusionnent réellement, utilisez cette syntaxe:
var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();
ne pas:
var appSettings = new AppSettings();
Configuration.Bind("AppSettings", appSettings);
return appSettings;
Ce dernier ne restituera pas les données fusionnées.
Merci à Shawn Wildermuth pour ceci
Si vous utilisez Azure, ajoutez ASPNETCORE_ENVIRONMENT avec la valeur correspondante aux paramètres d'application dans le côté de la webapp, qui récupérera ensuite les paramètres d'application corrects. {Value} .json file
La boîte de dialogue que vous avez liée dans l'image sert uniquement à configurer "launchSettings.json". Ce fichier n'est pas utilisé par votre application .
Il est uniquement utilisé par Visual Studio pour définir l'environnement et ouvrir une URL dans le navigateur lorsque vous appuyez sur F5 et rien d'autre.
Lorsque vous souhaitez changer d’environnement, vous devez configurer une variable d’environnement avant de lancer. La procédure à suivre dépend de votre environnement.
setx ASPNETCORE_ENVIRONMENT "Development"
$Env:ASPNETCORE_ENVIRONMENT = "Development"
export ASPNETCORE_ENVIRONMENT="Development"
ASPNETCORE_ENVIRONMENT="Development" dotnet run
Oui, il est spécifique à la machine (sauf pour Linux, que vous pouvez faire par commande). Cependant, dans IIS vous pouvez le faire aussi soit via différents pools d'applications ou en suivant ceci répond instructions pour l'ajouter à IIS