appsettings.jsonデータベース接続文字列、webapiの場所など、開発環境、ステージング環境、ライブ環境で異なる値をいくつか定義しました。
複数のappsettings.jsonファイル(appsettings.live.jsonなど)を作成し、実行中のビルド構成に基づいてasp.netアプリに使用するファイルを「認識」させる方法はありますか?
回答:
条件付きコンパイルを使用できます。
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();
}
研究開発に数時間かかるため、作業環境のスクリーンショットを追加しました。
まず、launch.jsonファイルにキーを追加します。
以下のスクリーンショットを参照してくださいDevelopment。環境として追加しました。
次に、プロジェクトappsettings.{environment}.jsonで、環境の名前を含む新しいファイルを作成します。
次のスクリーンショットで、名前が付いた2つの異なるファイルを探します。
appsettings.Development.JsonappSetting.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)
        .AddEnvironmentVariables();
    Configuration = builder.Build();
}
そして最後に、次のようにコマンドラインから実行できます。
dotnet run --environment "Development"
"Development"私の環境の名前はどこですか。
IWebHostEnvironment代わりに使用する必要があります。
                    CreateDefaultBuilderこれを使用すると、構成オブジェクトが自動的にビルドされ、スタートアップクラスに渡されます。
WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
public class Startup
{
    public Startup(IConfiguration configuration) // automatically injected
    {
        Configuration = configuration;
    }
    public IConfiguration Configuration { get; }
    /* ... */
}
CreateDefaultBuilder適切なファイルが自動的に含まれるため、環境ごとに個別のappsettingsファイルを追加します。appsettings.Environment.json
次に、実行/デバッグ時にASPNETCORE_ENVIRONMENT 環境変数を設定します
IDEに応じて、dotnetプロジェクトが従来から環境変数を探す場所がいくつかあります。
以下のためのVisual Studioの[プロジェクト]> [プロパティ]> [デバッグ]> [環境変数にアクセスしてください。
以下のためのVisual Studioのコード、編集.vscode/launch.json> env:
起動設定を使用して、編集Properties/launchSettings.json> environmentVariables:
VisualStudioのツールバーからも選択できます
使用DOTNET CLIを、のための適切な構文を使用し、あなたのOSごとの環境変数を設定します
注:アプリが起動されるとDOTNET実行、
launchSettings.json利用可能な場合読み込まれ、environmentVariableslaunchSettings.jsonオーバーライド環境変数の設定。
Host.CreateDefaultBuilderますか?Host.CreateDefaultBuilderプラットフォーム拡張機能の下に追加された.NETCore 3.0は、デフォルトの初期化IConfigurationを提供し、次の順序でアプリのデフォルト構成を提供します。
appsettings.jsonJSON構成プロバイダーを使用します。
appsettings.Environment.jsonJSON構成プロバイダーを使用します。例えば:
appsettings.Production.jsonまたは
appsettings.Development.json- アプリが開発環境で実行されるときのアプリの秘密。
- 環境変数構成プロバイダーを使用した環境変数。
- コマンドライン構成プロバイダーを使用したコマンドライン引数。
ASP.NET Coreでは、適切なappsettings.jsonのビルド構成ではなく、環境変数を使用する必要があります
プロジェクトを右クリック>プロパティ>デバッグ>環境変数
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の回答を使用すると、問題が発生する可能性があります。Azureでappsettings.json値をオーバーライドする場合。
次のよう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現在のビルド構成に基づいて選択したいことに気づきました。これは私の提案した解決策では達成できず、これを行う方法があるかどうかわかりません。ただし、「環境変数」の方法は機能し、アプローチの代替としても適している可能性があります。
.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);
   }
 }
ASPNETCORE_ENVIRONMENT。値は、に置き換えられるものですctx.HostingEnvironment.EnvironmentName}。したがって、プロパティでその値を「Production」に設定すると、プロジェクトはconfig.Production.jsonルートフォルダでファイルを検索します。詳細については、このリンクを参照してください
                    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(...
                    次のような複数のファイルを作成します。appSettings.$(Configuration).json
appSettings.staging.jsonappSettings.production.jsonそれぞれのファイルをappSettings.json次の場所にコピーするプロジェクトでビルド前イベントを作成します。
copy appSettings.$(Configuration).json appSettings.json
ConfigBuilderでのみ使用appSettings.jsonしてください。
var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddEnvironmentVariables();
Configuration = builder.Build();
あなたは、コンフィギュレーション名を追加することができますASPNETCORE_ENVIRONMENTでlaunchSettings.json、以下のよう
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:58446/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "environmentVariables": {
        ASPNETCORE_ENVIRONMENT": "$(Configuration)"
      }
    }
  }
これは、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);
.vscode / launch.jsonファイルは、VisualStudioと/Properties/launchSettings.jsonファイルでのみ使用されます。これらのファイルを本番環境で使用しないでください。
launchSettings.jsonファイル:
プロファイル設定が含まれています。
たとえば、ファイル「appSettings.QA.json」を使用するには。'ASPNETCORE_ENVIRONMENT'を使用できます。以下の手順に従ってください。