【C#】環境別構成ファイル(appsettings.{Env}.json)による設定の切り替え

目次

概要

開発(Development)、検証(Staging)、本番(Production)といった環境ごとに異なる設定値を適用する実装です。 .NETの構成システムは、ベースとなる appsettings.json を読み込んだ後、環境変数 DOTNET_ENVIRONMENT に対応する appsettings.{Environment}.json を上書き読み込み(マージ)します。これにより、環境固有の値だけを差分管理できます。

仕様(入出力)

  • 入力
    • appsettings.json(共通・デフォルト設定)
    • appsettings.Development.json(開発環境用・上書き)
    • appsettings.Production.json(本番環境用・上書き)
    • 環境変数 DOTNET_ENVIRONMENT
  • 出力
    • 現在の環境に合わせてマージされた構成値
  • 動作
    • キーが存在すれば上書きし、存在しなければベースファイルの値を維持します。

構成ファイル定義

プロジェクト直下に以下の3つのJSONファイルを作成し、「出力ディレクトリにコピー」設定を有効にします。

1. appsettings.json (ベース)

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "BaseUrl": "http://localhost/website/",
  "Message": "appsettings.jsonの値です (Default)"
}

2. appsettings.Development.json (開発用)

Message キーのみを上書きします。

{
  "Message": "appsettings.Development.jsonの値です (Dev Mode)"
}

3. appsettings.Production.json (本番用)

BaseUrl キーのみを上書きします。

{
  "BaseUrl": "http://example.com/website/"
}

コード全文

現在の環境名と、マージされた設定値を確認するワーカースラスです。

using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace EnvConfigSample
{
    public class ConfigPrinterWorker : IConsoleWorker
    {
        private readonly IConfiguration _configuration;
        private readonly IHostEnvironment _env;
        private readonly ILogger<ConfigPrinterWorker> _logger;

        // IConfiguration: 設定値へのアクセス
        // IHostEnvironment: 現在の環境名(Development/Production等)の確認
        public ConfigPrinterWorker(
            IConfiguration configuration, 
            IHostEnvironment env,
            ILogger<ConfigPrinterWorker> logger)
        {
            _configuration = configuration;
            _env = env;
            _logger = logger;
        }

        public Task RunAsync()
        {
            Console.WriteLine($"\n=== 現在の環境: {_env.EnvironmentName} ===");

            // 1. BaseUrlの取得
            // Development環境では上書きファイルにこのキーがないため、ベースの値が使われる
            // Production環境では上書きファイルの値が使われる
            string baseUrl = _configuration["BaseUrl"];
            
            // 2. Messageの取得
            // Development環境では上書きファイルの値が使われる
            string message = _configuration["Message"];

            Console.WriteLine($"[Config] BaseUrl : {baseUrl}");
            Console.WriteLine($"[Config] Message : {message}");
            Console.WriteLine("=====================================\n");

            return Task.CompletedTask;
        }
    }

    // (参考) インターフェース定義
    public interface IConsoleWorker
    {
        Task RunAsync();
    }
}

実行方法と結果

実行時の環境変数 DOTNET_ENVIRONMENT によって読み込まれるファイルが変化します。

ケース1: 開発環境 (Development)

Visual Studioのデフォルト、または以下のコマンドで実行した場合。

# PowerShellでの設定例
$env:DOTNET_ENVIRONMENT = "Development"
dotnet run

実行結果 BaseUrlはベースファイル、MessageはDevelopmentファイルの値になります。

=== 現在の環境: Development ===
[Config] BaseUrl : http://localhost/website/
[Config] Message : appsettings.Development.jsonの値です (Dev Mode)
=====================================

ケース2: 本番環境 (Production)

本番サーバーへのデプロイ時、または明示的にProductionを指定した場合。

# PowerShellでの設定例
$env:DOTNET_ENVIRONMENT = "Production"
dotnet run

実行結果 BaseUrlはProductionファイル、Messageはベースファイル(Production用JSONに定義がないため)の値になります。

=== 現在の環境: Production ===
[Config] BaseUrl : http://example.com/website/
[Config] Message : appsettings.jsonの値です (Default)
=====================================

まとめ

Microsoft.Extensions.Hosting のデフォルトビルダーを使用するだけで、appsettings.{Environment}.json の読み込みルールは自動的に適用されます。コード側で分岐処理(if (IsDevelopment) ...)を書く必要はなく、環境変数を切り替えるだけで設定値が透過的に差し替わるため、デプロイメントパイプラインでの管理が非常に容易になります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次