web-dev-qa-db-ja.com

.NET Coreを使用して公開プロファイルに基づいてappsettings.jsonを更新する方法

現在、.NET Frameworkから.NET Coreに切り替えています。以前は、アプリケーション設定はすべてWeb.configファイルにありました。新しい公開プロファイルを追加したときに、右クリックして[構成変換の追加]を選択すると、Web.configの下にネストされたWeb。{Profile} .configファイルが生成され、それぞれのプロファイルに固有のアプリケーション設定を設定できます。

今、.NET Coreで、Web.configファイルの代わりにappsettings.jsonファイルを使用して同じ効果を達成したいと考えています。 appsettings.jsonファイルの下にネストされ、発行プロファイルに固有の設定を含むappsettings。{Profile} .jsonファイルを作成するにはどうすればよいですか?もちろん、手動でファイルを作成できますが、アプリケーションが公開されたときにappsettings.jsonをオーバーライドするように設定を「リンク」するのは何ですか?古い.NET Frameworkプロジェクトで説明したように、Visual Studioでこれを行う簡単な方法はありますか?それとも何か不足していますか?

ありがとう!

7
Matthew

しかし、アプリケーションが公開されたときにappsettings.jsonをオーバーライドするように設定を「リンク」するのは何ですか?

AppsettingsはProgram.csWebHostで構成されます

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>();

webhost.cs の実装では、フレームワークはwebhostにappsettingsを追加します。

config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

2行目は、環境固有のappsettingsを追加する場所です。 Visual Studio内では、この環境変数はProject Settings -> Debugページで定義され、ASPNETCORE_ENVIRONMENTと呼ばれます。デフォルトではDevelopmentに設定されているため、Visual Studio内でビルドおよび実行すると、appsettings.development.jsonファイル(存在する場合)がロードされ、appsettings.jsonファイルの一致する設定が上書きされます。

アプリケーションを公開するときに、同じ名前のOS環境変数を使用してこの値をオーバーライドできます。 .NET Coreが値を読み取り、「最後に勝つ」ポリシーを持つ場所の階層があります。

現在、階層は次のとおりです。

  1. ファイル(appsettings.json、appsettings。{Environment} .json、ここで{Environment}はアプリの現在のホスティング環境です)
  2. Azure Key Vault
  3. ユーザーシークレット(シークレットマネージャー)(開発環境のみ)
  4. 環境変数
  5. コマンドライン引数

したがって、アプリを公開するときに、環境変数を使用してホストOSの環境をオーバーライドできます。 .NET Coreが公開アプリを起動すると、その変数を読み取り、適切なappsettings。{environment} .jsonファイルを読み込みます。値が設定されていない場合、またはその環境にファイルが存在しない場合、appsettings.jsonの設定が適用されます。

ASPNETCORE_ENVIROMENT設定の詳細を読むことができます here

5
Simply Ged

...そして、元のコメント以来、ネストおよび変換ビルドコマンドが一部である必要がないことに気づいた後、web 2017.MSおよびMS Build for .NET Coreでweb.configトランスフォームが完全にサポートされていることがわかりましたもうプロジェクト。 プロジェクトファイルを破損しない修正を見つけない限り、web.configで「構成変換の追加」コマンドを使用しないでください。 web.configの変換バージョンを手動で追加するだけで、公開時に自動的にネストされて実行されます。うんVS 2017!

以下は、web.Release.configで環境変数を設定するのに非常にうまく機能します。

<configuration xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">
  <location>
    <system.webServer>
      <aspNetCore>
        <environmentVariables>
          <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" xdt:Locator="Match(name)" xdt:Transform="SetAttributes" />
        </environmentVariables>
      </aspNetCore>
    </system.webServer>
  </location>
</configuration>

さらに、.NET Core 2.2では、スタートアップクラスに追加のappsettings変換(環境変数をオフにする)を追加する必要がなくなりました。このデフォルト...

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

...受け入れられた回答のコードを自動的に処理します。

結論としては、Microsoftの開発者として、私はアプリケーションがIISサーバー、MS BuildおよびWeb Deployを使用してのみ公開されることを想定しています。アプリケーション独自の構成を使用してアプリケーションを構成し、発行または発行後のコマンドラインコマンドとしてではなく、ビルドでこれを実行できるようにします。Microsoftまたは誰かが変換するVisual Studioのシンプルなビルドプラグインを作成する場合私のappsettings.jsonファイルなので、特定の環境に必要なものだけを公開し、喜んでそれを使用しますが、まだ見つけていないか、書く時間がありました。

そのため、OPの質問に直接回答するようにします。appSettingsはweb.configからappsettings.jsonに簡単に転送できます。appsettings.jsonファイルがすべて公開され、実行時に決定されることを理解している限り、おそらくそうすべきです。 -要求されたプロファイルに基づいて、必要なファイルと設定のみが公開される真の変換ソリューションとは異なります。 web.config変換は、使用するappsettings。{env} .jsonファイルを決定するために必要な環境変数を設定するためにのみ使用します。繰り返しになりますが、OPが要求したように、web.configと同じようにapsettings.jsonファイルを変換できる場合、この議論全体はDodoのやり方になります。まだ来ていなければ、いつか来ると思う。

はい、レガシー.NET Frameworkから.NET Coreに移行するのは楽しい練習になります。 .NET Coreは大きな前進ですが、乗り越えなければならないハードルがいくつかあります。特に最初からレガシーを使用している人に。

4
iGanja