web-dev-qa-db-ja.com

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

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

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

49
tweetypi

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

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
Dmitry

R&Dに数時間かかるため、作業環境のスナップショットを追加しました。

最初にLaunch.Jsonファイルにキーを追加します。

以下のスナップを参照して、"Development"を環境として追加しました。

enter image description here

次に、プロジェクトに同じ名前のappSettingファイルを追加します。

スナップが追加されました。名前の異なる2つのファイルを探します。

  • appSettings.Development.Json
  • appSetting.json

enter image description here

最後に、以下のように、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();
    }

そして、ついに私はこのように端末から実行しています。

dotnet run --environment "開発"

ここで、開発は私の環境です。

51
Bharat

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

   }
 }
25
uex

次のように、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ファイルにすべてのグローバル構成値を配置し、これらの新しいファイルに環境固有のもののみを配置できることに注意してください。

これで、特定の環境値( "live"、 "staging"、 "production"など)を持つASPNETCORE_ENVIRONMENTという環境変数のみが必要になります。開発環境のプロジェクト設定でこの変数を指定できます。もちろん、ステージング環境と実稼働環境でもこの変数を設定する必要があります。そこで行う方法は、これがどのような環境であるかによって異なります。

PDATE:現在のビルド構成に基づいてappsettings.xxx.jsonを選択することに気付きました。私の提案したソリューションではこれを達成できず、これを行う方法があるかどうかわかりません。ただし、「環境変数」の方法は機能し、アプローチに代わる優れた選択肢になる可能性があります。

22
Onkel Toob

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

プロジェクトを右クリックして、[プロパティ]> [デバッグ]> [環境変数]

enter image description here

ASP.NET Coreは適切なappsettings.jsonファイルを取得します。

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

    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の方法でやると、問題が発生します。 whenAzureのappsettings.json値をオーバーライドします。

20
walkerbox

以下のように、ASPNETCORE_ENVIRONMENTlaunchSettings.jsonとして構成名を追加できます。

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

1. appSettings.staging.json appSettings.production.jsonのような複数のappSettings。$(Configuration).jsonsを作成します

2.プロジェクトでビルド前イベントを作成し、それぞれのファイルをこのようにappSettings.jsonにコピーします

コピーappSettings。$(Configuration).json appSettings.json

3. Config BuilderでappSettings.jsonのみを使用します

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

        Configuration = builder.Build();
2
user3924036