asp.netコアの開発環境とリリース環境にappsettings.jsonを自動的に設定しますか?


105

appsettings.jsonデータベース接続文字列、webapiの場所など、開発環境、ステージング環境、ライブ環境で異なる値をいくつか定義しました。

複数のappsettings.jsonファイル(appsettings.live.jsonなど)を作成し、実行中のビルド構成に基づいてasp.netアプリに使用するファイルを「認識」させる方法はありますか?

回答:


31

条件付きコンパイルを使用できます。

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();
}

28
MSBuild / TFSビルドで環境変数を設定する必要があります。条件付きコンパイルは、CIビルドで簡単に処理できるものの間違いにつながります。つまり、.AddJsonFile($ "appsettings。{env.EnvironmentName} .json"、オプション:true)
Nick Turner

1
環境変数については、私の回答(stackoverflow.com/a/50331886/1319086)を参照してください
Jonatan Dragon

10
この種のアプローチでは、コードを環境ごとに特別に再コンパイルする必要があり、他の場所に再配布/インストールすることはできません。
tvdias 2018年

2
質問は「ビルド構成について知ること」についてでした
Dmitry

6
これは、承認された回答としてマークされるべきではありません-これは解決策ですが、ベストプラクティスではありません。
チャーリー

98

研究開発に数時間かかるため、作業環境のスクリーンショットを追加しました。

  1. まず、launch.jsonファイルにキーを追加します。

    以下のスクリーンショットを参照してくださいDevelopment。環境として追加しました。

    launch.jsonでの環境変数の宣言

  2. 次に、プロジェクトappsettings.{environment}.jsonで、環境の名前を含む新しいファイルを作成します。

    次のスクリーンショットで、名前が付いた2つの異なるファイルを探します。

    • appsettings.Development.Json
    • appSetting.json


    appsettingsJSONファイルのプロジェクトビュー

  3. そして最後に、次のように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();
    }
    
  4. そして最後に、次のようにコマンドラインから実行できます。

    dotnet run --environment "Development"
    

    "Development"私の環境の名前はどこですか。


2
これを試してみましたが、うまく機能します。VS2017は、ベースファイルの下にあるように異なるバージョンも表示します。賛成票。
ロベルト

1
ihostingenvironmentが無効になっているため、コア2.2でどのように実行しますか
djack1

2
@ djack109IWebHostEnvironment代わりに使用する必要があります。
alessandrocb

66

.NET Core3.0以降の更新

  1. CreateDefaultBuilderこれを使用すると、構成オブジェクトが自動的にビルドされ、スタートアップクラスに渡されます。

    WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
    
    public class Startup
    {
        public Startup(IConfiguration configuration) // automatically injected
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }
        /* ... */
    }
    
  2. CreateDefaultBuilder適切なファイルが自動的に含まれるため、環境ごとに個別のappsettingsファイルを追加します。appsettings.Environment.json

    appsettings.env.json

  3. 次に、実行/デバッグ時にASPNETCORE_ENVIRONMENT 環境変数を設定します

環境変数の設定方法

IDEに応じて、dotnetプロジェクトが従来から環境変数を探す場所がいくつかあります。

  • 以下のためのVisual Studioの[プロジェクト]> [プロパティ]> [デバッグ]> [環境変数にアクセスしてください。

    VisualStudio-環境変数

  • 以下のためのVisual Studioのコード、編集.vscode/launch.json> env

    VisualStudioコード>起動環境

  • 起動設定を使用して、編集Properties/launchSettings.json> environmentVariables

    起動設定

    VisualStudioのツールバーからも選択できます

    [設定の起動]ドロップダウン

  • 使用DOTNET CLIを、のための適切な構文を使用し、あなたのOSごとの環境変数を設定します

    :アプリが起動されるとDOTNET実行launchSettings.json利用可能な場合読み込まれ、environmentVariableslaunchSettings.jsonオーバーライド環境変数の設定。

どのように機能しHost.CreateDefaultBuilderますか?

Host.CreateDefaultBuilderプラットフォーム拡張機能の下に追加された.NETCore 3.0は、デフォルトの初期化IConfigurationを提供し、次の順序でアプリのデフォルト構成を提供します。

  1. appsettings.jsonJSON構成プロバイダーを使用します
  2. appsettings.Environment.jsonJSON構成プロバイダーを使用します。例えば:
    • appsettings.Production.json または
    • appsettings.Development.json
  3. アプリが開発環境で実行されるときのアプリの秘密
  4. 環境変数構成プロバイダーを使用した環境変数
  5. コマンドライン構成プロバイダーを使用したコマンドライン引数。

さらに読む-MSDocs


おかげで、それは良いですが、コンソールプロセス(またはワーカープロセステンプレート/足場)でそれを行う方法は?
HB0

これは最新バージョンでは機能しません。常にappsettings.jsonを取得し、appsettings.development.jsonを無視します。run(dev)とrun(prod)もありません。
user10349 1220

45

ASP.NET Coreでは、適切なappsettings.jsonのビルド構成ではなく、環境変数を使用する必要があります

  1. プロジェクトを右クリック>プロパティ>デバッグ>環境変数

    環境変数

  2. ASP.NET Coreは、適切なappsettings.jsonファイルを使用します。

    ソリューションエクスプローラーでのappsettingsファイルの例

  3. これで、その環境変数を次のように使用できます。

    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の回答を使用すると、問題が発生する可能性があります。Azureでappsettings.json値をオーバーライドする場合


35

次のよう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ファイルに入れて、環境固有のものだけをこれらの新しいファイルに入れることができることに注意してください。

これASPNETCORE_ENVIRONMENTで、特定の環境値( "live"、 "staging"、 "production"など)で呼び出される環境変数のみが必要になります。この変数は、開発環境のプロジェクト設定で指定できます。もちろん、ステージング環境と本番環境でも設定する必要があります。そこでのやり方は、これがどのような環境であるかによって異なります。

更新:appsettings.xxx.json現在のビルド構成に基づいて選択したいことに気づきました。これは私の提案した解決策では達成できず、これを行う方法があるかどうかわかりません。ただし、「環境変数」の方法は機能し、アプローチの代替としても適している可能性があります。


プロジェクトのプロパティ->デバッグセクションで環境変数の使用を検討しましたが、プロジェクトの設定に基づいてこれがどのように変化するかは明らかではありません。それを処理するためにプロジェクトに追加できる別のファイルですか?
meds 2017

プロジェクトプロパティ内で変数を設定することは、開発環境(おそらくVisual Studio)で使用する場合にのみ機能します。特定の環境(IIS、Azure)に応じて、デプロイされたアプリの別の場所に設定する必要があります。このファイルもデプロイされる可能性があるため、一部の構成ファイルに変数を設定してから、サーバー値をオーバーライドすることはお勧めしません。
Onkel Toob 2017

ビルド構成でセットアップします。ビルド構成ファイルがない場合は手動で実行しているため、(古風な)デプロイメントプロファイルでセットアップする必要があります
Nick Turner

Azureには、テスト、ステージング、本番環境などの複数の環境があります。WebアプリのリリースビルドをVSからAzureに公開する場合、ASPNETCORE_ENVIRONMENT変数はどこで変更しますか?
冷ややかな

展開中に変数を変更するのではなく、特定の環境に組み込まれています。Azureでは、「アプリケーション設定」を使用して、アプリサービス構成内でこれらの値を直接設定できます。複数のスロットで作業している場合は、それらを「展開スロット設定」としてマークすることを忘れないでください。
OnkelToob19年

29

.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);

   }
 }

2
使用している環境をどのように切り替えますか?設定ファイルに変更が加えられることになっていますか?私はへのAzure上のプロジェクトを実行するとき、私は私が使用してしたいURLを追加する必要があります理解しappsettings.jsonとURLが、私は(F5で)ローカルで実行したときに実行したいappsettings.Development.json。あれは正しいですか?使用したい文字列はlaunchSettings.jsonファイルにあり、アプリケーションが実行される場所に基づいて文字列を変更する方法が少しわかりません(または変更されることになっている場合)。
DonkeyBanana 2018

3
@DonkeyBanana環境は、プロジェクトのプロパティで指定された設定にすぎません。VS 2017では、プロジェクト>プロパティを右クリックします。デバッグ中、キーの現在の環境が表示されますASPNETCORE_ENVIRONMENT。値は、に置き換えられるものですctx.HostingEnvironment.EnvironmentName}。したがって、プロパティでその値を「Production」に設定すると、プロジェクトはconfig.Production.jsonルートフォルダでファイルを検索します。詳細については、このリンクを参照してください
umutesen 2018

Error CS0266 Cannot implicitly convert type 'Microsoft.AspNetCore.Hosting.IWebHost' to 'Microsoft.AspNetCore.Hosting.IWebHostBuilder'. An explicit conversion exists (are you missing a cast?) WebHost.CreateDefaultBuiler(...
Hecatonchires

ここでは、「CreateDefaultBuilderを使用して新しいホストビルダーを初期化すると、AddJsonFileが自動的に2回呼び出される」と記載されていることに注意してください。言い換えれば、それはすでにappSettings.jsonをロードされた後、ご使用の環境の構成に基づいて、それは負荷のAppSettingsある{環境} .json。
デヴィッド・イェーツ

@umutsen最新のビジュアルスタジオでは、実行環境の設定はもうありません
user10349 1220

13
  1. 次のような複数のファイルを作成します。appSettings.$(Configuration).json

    • appSettings.staging.json
    • appSettings.production.json
  2. それぞれのファイルをappSettings.json次の場所にコピーするプロジェクトでビルド前イベントを作成します。

    copy appSettings.$(Configuration).json appSettings.json
    
  3. ConfigBuilderでのみ使用appSettings.jsonしてください。

    var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables();
    
    Configuration = builder.Build();
    

これは受け入れられた答えであるはずです。複雑なケースでは、SlowCheetahを使用できます。
AntonKrouglov20年

8

あなたは、コンフィギュレーション名を追加することができますASPNETCORE_ENVIRONMENTlaunchSettings.json、以下のよう

  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:58446/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "environmentVariables": {
        ASPNETCORE_ENVIRONMENT": "$(Configuration)"
      }
    }
  }

3

これは、Webページなしでコンソールアプリを使用するときに機能するバージョンです。

var builder = new ConfigurationBuilder()
             .SetBasePath(Directory.GetCurrentDirectory())
             .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
             .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true);

            IConfigurationRoot configuration = builder.Build();
            AppSettings appSettings = new AppSettings();
            configuration.GetSection("AppSettings").Bind(appSettings);

0

.vscode / launch.jsonファイルは、VisualStudioと/Properties/launchSettings.jsonファイルでのみ使用されます。これらのファイルを本番環境で使用しないでください。

launchSettings.jsonファイル:

  1. ローカル開発マシンでのみ使用されます。
  2. 展開されていません。
  3. プロファイル設定が含まれています。

    • launchSettings.jsonで設定された環境値は、システム環境で設定された値をオーバーライドします

たとえば、ファイル「appSettings.QA.json」を使用するには。'ASPNETCORE_ENVIRONMENT'を使用できます。以下の手順に従ってください。

  1. ホストマシンに新しい環境変数を追加し、「ASPNETCORE_ENVIRONMENT」と呼びます。その値を「QA」に設定します。
  2. プロジェクトにファイル「appSettings.QA.json」を作成します。ここに構成を追加します。
  3. 手順1でマシンにデプロイします。「appSettings.QA.json」がデプロイされていることを確認します。
  4. あなたのウェブサイトをロードします。ここではappSettings.QA.jsonが使用されることを期待してください。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.