J'ai défini certaines valeurs dans mon appsettings.json
pour des éléments tels que les chaînes de connexion à la base de données, les emplacements Webapi, etc., qui sont différentes pour les environnements de développement, de transfert et en direct.
Existe-t-il un moyen d'avoir plusieurs fichiers appsettings.json
(tels que appsettings.live.json
, etc., etc.) et de laisser l'application asp.net "savoir" lequel, à utiliser, en fonction de la configuration de construction en cours d'exécution?
Vous pouvez utiliser la compilation conditionnelle:
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();
}
J'ai ajouté un instantané de l'environnement de travail, car cela me coûte plusieurs heures de R & D.
Ajoutez d'abord la clé à votre fichier Launch.Json
.
Voir ci-dessous, j'ai ajouté "Development"
comme environnement.
Ajoutez ensuite un fichier appSetting avec le même nom dans votre projet.
Snap ajouté, recherchez 2 fichiers différents nommés avec.
appSettings.Development.Json
appSetting.json
Et enfin, configurez-le dans votre classe de démarrage, comme ci-dessous.
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();
}
Et enfin, je le lance depuis le terminal Comme ça.
dotnet run --environment "Development"
où le développement est mon environnement.
Juste une mise à jour pour les utilisateurs .NET core 2.0, vous pouvez spécifier la configuration de l'application après l'appel à 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);
}
}
Vous pouvez utiliser les variables d'environnement et la classe ConfigurationBuilder
dans votre constructeur Startup
comme ceci:
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();
}
Ensuite, vous créez un fichier appsettings.xxx.json
pour chaque environnement dont vous avez besoin, "xxx" étant le nom de l'environnement. Notez que vous pouvez mettre toutes les valeurs de configuration globales dans votre fichier "normal" appsettings.json
et ne placer que les éléments spécifiques à l'environnement dans ces nouveaux fichiers.
Désormais, vous n'avez besoin que d'une variable d'environnement appelée ASPNETCORE_ENVIRONMENT
avec une valeur d'environnement spécifique ("live", "staging", "production", peu importe). Vous pouvez spécifier cette variable dans les paramètres de votre projet pour votre environnement de développement. Vous devez bien entendu également la définir dans vos environnements de transfert et de production. La façon dont vous le faites dépend du type d’environnement.
UPDATE: Je viens de réaliser que vous voulez choisir le appsettings.xxx.json
en fonction de votre configuration actuelle build. Cela ne peut pas être réalisé avec la solution proposée et je ne sais pas s’il est possible de le faire. La "variable d'environnement", cependant, fonctionne et pourrait tout aussi bien être une bonne alternative à votre approche.
Dans ASP.NET Core, vous devriez plutôt utiliser EnvironmentVariables plutôt que la configuration de construction pour appsettings.json approprié.
Faites un clic droit sur votre projet> Propriétés> Déboguer> Variables d'environnement
ASP.NET Core utilisera le fichier appsettings.json approprié.
Maintenant, vous pouvez utiliser cette variable d'environnement comme ceci:
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();
}
Si vous le faites à la manière de Dmitry, vous aurez des problèmes, par exemple. lors de la substitution de valeurs appsettings.json sur Azure.
Vous pouvez ajouter le nom de la configuration en tant que ASPNETCORE_ENVIRONMENT
dans le launchSettings.json
comme ci-dessous.
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:58446/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"environmentVariables": {
ASPNETCORE_ENVIRONMENT": "$(Configuration)"
}
}
}
1.Créez plusieurs appSettings. $ (Configuration) .jsons comme AppSettings.staging.json AppSettings.production.json
2.Créez un événement de pré-génération sur le projet qui copie le fichier correspondant dans appSettings.json comme ceci
copier appSettings. $ (Configuration) .json appSettings.json
3.Utilisez uniquement appSettings.json dans votre Config Builder
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
Configuration = builder.Build();