web-dev-qa-db-ja.com

asp.netコアアプリケーションを展開するときに環境の違いに対処する方法

ASP.NET Coreアプリケーションをデプロイするときに環境設定を変更する方法はありますか(デバッグ/リリースビルドを使用した構成ファイルの変換など)?

.NET Coreアプリケーションで複数の環境設定を維持するための最良のアプローチは何ですか(ローカル、ステージング、および本番用の<appSettings file="local.config">に類似したもの)?

9
Soma Yarlagadda

中央の構成ファイルは_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で複数の環境を使用 で説明されています)。異なるスコープ内で環境変数になるまで煮詰めます:

  1. 環境変数(グローバルには、Windows cmd.exe _set ASPNETCORE_ENVIRONMENT=Development_またはPowerShellの場合は_$Env:ASPNETCORE_ENVIRONMENT = "Development"_、Linuxの場合は_export ASPNETCORE_ENVIRONMENT = Development_)
  2. コマンドごとの環境変数(つまり、linux:_ASPNETCORE_ENVIRONMENT=Production dotnet MyApp.dll_)
  3. Dockerコンテナー、つまりdocker-compose.yaml

    _web:
        environment:
        - ASPNETCORE_ENVIRONMENT=Debugging
    _
  4. コマンドラインによるDockerコンテナ_docker run -e ASPNETCORE_ENVIRONMENT=Debugging_
  5. IIS web.config経由。

    _<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" forwardWindowsAuthToken="false" stdoutLogEnabled="true" >
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
    _
  6. IIS AppPoolごとに設定します( ここ)を参照
  7. Linuxの場合、サービス定義ファイルを介して( docs を参照)
  8. 環境変数を介したAzure App Serviceは、スロットごとに設定でき、ステージング、開発、プロダクション、つまりステージングへのデプロイ、ウォームアップ、プロダクションとのスワップのための異なるスロットを持つことができます
  9. _dotnet run --launch-profile Development_による実行ごと

これらはすべて、特定のスコープ内の環境変数を変更または設定します(グローバルに、コンテナーに対してローカルに、アプリケーションプール内で、実行ごとなど)。ニーズに合ったものを選択してください。

22
Tseng

追加の_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ファイル名を作成して、さまざまな開発シナリオとデプロイメントシナリオを明確に区別できます。

0
Jpsy