ASP.NET Coreアプリケーションをデプロイするときに環境設定を変更する方法はありますか(デバッグ/リリースビルドを使用した構成ファイルの変換など)?
.NET Coreアプリケーションで複数の環境設定を維持するための最良のアプローチは何ですか(ローカル、ステージング、および本番用の<appSettings file="local.config">
に類似したもの)?
中央の構成ファイルは_appsettings.json
_であり、_appsettings.Production.json
_などの複数のファイルを使用できます。これらのファイルは、読み込まれて_appsettings.json
_からの設定をオーバーライドします。
例えば
_ // Set up configuration sources.
var builder = new ConfigurationBuilder()
.SetBasePath(hostEnv.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{hostEnv.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
_
これを機能させるために必要なのは、環境タイプを設定するための環境変数だけです(ドキュメント here を参照)。
構成ビルダーにAddEnvironmentVariables()
を追加すると、環境変数をオーバーライドすることもできます。したがって、appsettings.jsonがある場合
_{
"Data" {
"Default" {
"ConnectionString" : "..."
}
}
}
_
環境変数を介してそれをオーバーライドしたい場合は、「Data:Default:ConnectionString」という環境変数を設定します。その値は、appsettings.configおよびappsettings.Production.configの設定をオーバーライドします(.AddEnvironmentalVariables()
はafter.AddJsonFile()
と呼ばれ、環境変数の値を使用してキーが最後に登録されたものが優先されます)。
詳細は公式ドキュメント here をご覧ください。
コメントでこれを環境を設定する唯一の方法として理解している人もいるので、環境変数を設定する方法はたくさんあります(ほとんどは ASP.NET Coreで複数の環境を使用 で説明されています)。異なるスコープ内で環境変数になるまで煮詰めます:
set ASPNETCORE_ENVIRONMENT=Development
_またはPowerShellの場合は_$Env:ASPNETCORE_ENVIRONMENT = "Development"
_、Linuxの場合は_export ASPNETCORE_ENVIRONMENT = Development
_)ASPNETCORE_ENVIRONMENT=Production dotnet MyApp.dll
_)Dockerコンテナー、つまりdocker-compose.yaml
_web:
environment:
- ASPNETCORE_ENVIRONMENT=Debugging
_
docker run -e ASPNETCORE_ENVIRONMENT=Debugging
_IIS web.config経由。
_<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" forwardWindowsAuthToken="false" stdoutLogEnabled="true" >
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
_
dotnet run --launch-profile Development
_による実行ごとこれらはすべて、特定のスコープ内の環境変数を変更または設定します(グローバルに、コンテナーに対してローカルに、アプリケーションプール内で、実行ごとなど)。ニーズに合ったものを選択してください。
追加の_appsettings.*.json
_ファイルを使用するのが良い方法です。 *フラグメントを使用して、マシン、ユーザー、またはデプロイメントシナリオを区別する固有の環境プロパティを混在させることができます。
しかし、new ConfigurationBuilder()
を使用して最初から構成オブジェクトを構築する代わりに(Web上の多くのソースに示されているように)、別のアプローチをお勧めします。次のコードは既存の構成を置き換えませんが、それに追加します。
_ public IHostingEnvironment _environment { get; }
public IConfiguration _configuration { get; }
public Startup(IConfiguration configuration, IHostingEnvironment environment)
{
_environment = environment;
// use the default config and add config from appsettings.COMPUTERNAME.json (if it exists)
var builder = new ConfigurationBuilder()
.SetBasePath(environment.ContentRootPath)
.AddConfiguration(configuration)
.AddJsonFile($"appsettings.{System.Environment.GetEnvironmentVariable("COMPUTERNAME")}.json", optional: true);
_configuration = builder.Build();
}
_
背景:
dotnet new テンプレートに基づいてプロジェクトを作成すると、プロジェクトには CreateDefaultBuilder() メソッドによって自動的に構築される便利な設定がすでに含まれています。このデフォルト設定は、複数のソース(appsettings.json、appsettings。{Environment} .json、Secret Manager、環境変数、およびコマンドライン引数)からの情報を組み合わせます。
自分で設定を完全に再構築すると、その魔法はすべて失われます。
ヒント:
上記の例では、_appsettings.COMPUTERNAME.json
_は単なる例です。 __environment
_または_System.Environment
_の任意のデータから独自のjsonファイル名を作成して、さまざまな開発シナリオとデプロイメントシナリオを明確に区別できます。