データベース接続文字列、webapiの場所など、開発、ステージング、ライブ環境で異なるものについて、appsettings.json
でいくつかの値を定義しました。
複数のappsettings.json
ファイル(appsettings.live.json
など)を使用し、実行中のビルド構成に基づいてasp.netアプリが使用するファイルを「認識」する方法はありますか?
条件付きコンパイルを使用できます。
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();
}
R&Dに数時間かかるため、作業環境のスナップショットを追加しました。
最初にLaunch.Json
ファイルにキーを追加します。
以下のスナップを参照して、"Development"
を環境として追加しました。
次に、プロジェクトに同じ名前のappSettingファイルを追加します。
スナップが追加されました。名前の異なる2つのファイルを探します。
appSettings.Development.Json
appSetting.json
最後に、以下のように、Startupクラスに設定します。
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();
}
そして、ついに私はこのように端末から実行しています。
dotnet run --environment "開発"
ここで、開発は私の環境です。
.NET Core 2.0ユーザー向けの更新プログラムです。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);
}
}
次のように、ConfigurationBuilder
コンストラクターの環境変数とStartup
クラスを使用できます。
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();
}
次に、必要なすべての環境に対してappsettings.xxx.json
ファイルを作成します。「xxx」は環境名です。 「通常の」appsettings.json
ファイルにすべてのグローバル構成値を配置し、これらの新しいファイルに環境固有のもののみを配置できることに注意してください。
これで、特定の環境値( "live"、 "staging"、 "production"など)を持つASPNETCORE_ENVIRONMENT
という環境変数のみが必要になります。開発環境のプロジェクト設定でこの変数を指定できます。もちろん、ステージング環境と実稼働環境でもこの変数を設定する必要があります。そこで行う方法は、これがどのような環境であるかによって異なります。
PDATE:現在のビルド構成に基づいてappsettings.xxx.json
を選択することに気付きました。私の提案したソリューションではこれを達成できず、これを行う方法があるかどうかわかりません。ただし、「環境変数」の方法は機能し、アプローチに代わる優れた選択肢になる可能性があります。
ASP.NET Coreでは、適切なappsettings.jsonのビルド構成ではなく、EnvironmentVariablesを使用する必要があります。
プロジェクトを右クリックして、[プロパティ]> [デバッグ]> [環境変数]
ASP.NET Coreは適切なappsettings.jsonファイルを取得します。
これで、この環境変数を次のように使用できます。
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();
}
@Dmitryの方法でやると、問題が発生します。 whenAzureのappsettings.json値をオーバーライドします。
以下のように、ASPNETCORE_ENVIRONMENT
のlaunchSettings.json
として構成名を追加できます。
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:58446/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"environmentVariables": {
ASPNETCORE_ENVIRONMENT": "$(Configuration)"
}
}
}
1. appSettings.staging.json appSettings.production.jsonのような複数のappSettings。$(Configuration).jsonsを作成します
2.プロジェクトでビルド前イベントを作成し、それぞれのファイルをこのようにappSettings.jsonにコピーします
コピーappSettings。$(Configuration).json appSettings.json
3. Config BuilderでappSettings.jsonのみを使用します
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
Configuration = builder.Build();