web-dev-qa-db-ja.com

.NET Core MVCプロジェクトでappsettings.jsonを変換するにはどうすればよいですか?

プロジェクトに追加のjson configファイルを追加しました

appsettings.DEV.json
appsettings.QA.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, reloadOnChange: true);
    ...

また、環境を変更する方法を理解しています。プロジェクトプロパティのASPNETCORE_ENVIRONMENT環境変数の値を変更します。ただし、構成に応じて異なる環境変数を指定する機能はないようです。ドロップダウンリストには「N/A」というラベルが付けられ、無効になっています。

私が見る唯一のオプションは、環境変数の値を手動で変更し、使用するappsettingsを変更することです。自動的にそれを行う方法があると確信していますか、それともCIをどのように使用しますか? (スクリプトを使用して環境変数を変更する以外に、もっと簡単な方法が必要です)。

ここでの目標は、3つの環境(DEV、QA、およびPROD)の自動ビルドと継続的統合をセットアップすることです。DEVとQAは同じマシン上にあるため、環境を手動で指定する環境変数を設定することはオプションではありません。

Project Properties : Debug section

15
James Wierzba

Tsengsの回答から解決策を見つけましたが、わかりやすくするためにここで説明したいと思います。解決策は別の質問への回答にありますが、質問はかなり異なっています(そして、私も回答を拡大しました)。したがって、この質問は重複としてマークされるべきではないと思います。

答えは here です

解決策は、各IISキーASPNETCORE_ENVIRONMENTのサイトに異なる環境変数値を設定することです。

その手順は次のとおりです。

  1. IIS)でアプリケーションに移動し、Configuration Editorを選択します。
  2. Configuration Editorを選択します
  3. Sectionコンボボックスでsystem.webServer/aspNetCore(RC2およびRTM)またはsystem.webServer/httpPlatform(RC1)を選択します
  4. FromコンボボックスでApplicationhost.config ...を選択します。
  5. enviromentVariables要素をクリックして、編集ウィンドウを開きます。
  6. 環境変数を設定します。
  7. ウィンドウを閉じて「適用」をクリックします。
  8. 完了

または、applicationHost.configファイル(通常はC:\Windows\System32\inetsrv\config\applicationHost.configにある)を変更できます

ルート<Configuration>タグの下に次のエントリを追加します。ここで、「my-iis-site」はIISサイトの名前です。

<location path="my-iis-site">
    <system.webServer>
        <aspNetCore>
            <environmentVariables>
                <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="DEV" />
            </environmentVariables>
        </aspNetCore>
    </system.webServer>
</location>
10
James Wierzba

ビルドタイプからEnvironmentNameを決定する

ビルドタイプに基づいてEnvironmentNameを設定する場合は、WebHostBuilderに便利な.UseEnvironment(environmentName)があります(プログラムメインにあります)。

プロジェクトのビルド構成に対して適切なコンパイルシンボルが設定されている限り、次のような操作を行ってEnvironmentNameを決定できます。

public static void Main(string[] args)
{
    string environmentName;
#if DEBUG
    environmentName = "Development";
#Elif STAGING
    environmentName = "Staging";
#Elif RELEASE
    environmentName = "Production";
#endif

    var Host = new WebHostBuilder()
        .UseKestrel()
        .UseEnvironment(environmentName)
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .UseApplicationInsights()
        .Build();

    Host.Run();
}
17
Carl Sharman

Program.csでデフォルトのコードを使用している場合、プロジェクトで2つのファイルを作成する以外に何もする必要はありません。

_program.cs_のデフォルトコードは次のようになります。

_public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
_

code が実際に行っていることは次のとおりです。

_public static IWebHostBuilder CreateDefaultBuilder(string[] args)
        {
            var builder = new WebHostBuilder();

            ...

            builder.ConfigureAppConfiguration((hostingContext, config) =>
                {
                    var env = hostingContext.HostingEnvironment;

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

        ...

            return builder;
        }
_

したがって、あなたがしなければならないのは_appsettings.YourEnvionronmentalVariable.json_を作成するだけで、自動的に変換されます。

追加のメモ:2つのファイルを実際にマージするには、次の構文を使用します。

var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();

ではない:

_var appSettings = new AppSettings();
Configuration.Bind("AppSettings", appSettings);
return appSettings;
_

後者はマージされたデータを返しません。

this のShawn Wildermuthに感謝

8
Greg Gum

Azureを使用している場合は、webappの側のアプリケーション設定にASPNETCORE_ENVIRONMENTを対応する値とともに追加します。これにより、正しいappsettings。{value} .jsonファイルが取得されます

0
sensei

写真でリンクしたダイアログは、「launchSettings.json」を構成するためのものです。このファイルはアプリケーションでは使用されません

Visual Studioが環境を設定し、F5キーとnothingelseを押したときにブラウザーでURLを開くためにのみ使用されます。

環境を切り替える場合は、起動する前に環境変数を設定する必要があります。これを行う方法は、環境によって異なります。

Windows(コマンドライン、cmd.exe)

setx ASPNETCORE_ENVIRONMENT "Development"

Windows(Powershell)

$Env:ASPNETCORE_ENVIRONMENT = "Development"

Linux

export ASPNETCORE_ENVIRONMENT="Development"

Linux(単一のコマンド用に設定)

ASPNETCORE_ENVIRONMENT="Development" dotnet run

コメントに関する更新

はい、これはマシン固有です(Linuxはコマンドごとに実行できます)。ただし、IISでは、異なるアプリプールを使用するか、IISに追加するための この回答 の指示に従って、これも実行できます。

0
Tseng