はじめに
アプリケーション設定ファイルにappsettings.json
を使う方法があります。
元々ASP.NET Coreプロジェクトで使われている手法です。
ASP.NET Coreプロジェクトを作ると、開発環境用にappsettings.Development.json
とファイル名にサフィックスが付いたファイルが自動生成されます。
ここは環境変数ASPNETCORE_ENVIRONMENT
にDevelopment
やProduction
の値を与えると、サービスクラス側が自動判定して当該のファイルを読んでくれます。
ASP.NET Core の構成
いきさつ
しかし、この機能はASP.NET Coreの機能です。
コンソールアプリなど他のプロジェクトからは使えません。
という事で自分で実装します。
結論
- デバッグ設定に環境変数を追加する
- ただし環境変数名は
DOTNET_ENVIRONMENT
を採用する(ASP.NET Coreではないので)
- ただし環境変数名は
-
ConfigurationBuilder
のチェインを応用する - 環境変数
DOTNET_ENVIRONMENT
の値をファイル名のサフィックスにする
どうする
コード側だけでなくプロジェクト設定も必要です。
前提条件
- nugetからMicrosoft.Extensions.Configuration.Jsonをインストール
- .NET6.0以上(多分.NET Framework 4.6.2以降ならOK)
- appsettings.jsonは自分で作る事(ASP.NET CoreのプロジェクトからパクってきてもOK)
プロジェクト設定
Visual Studio 2022の内容です。シェルに環境変数を与えてもOKです。
- [ソリューションエクスプローラー]から対象のプロジェクトを右クリック
- コンテキストメニュから[プロパティ]
- 左ペインの[デバッグ]
- [デバッグ起動プロファイルUIを開く]
- [環境変数]に下記を追加
- 名前に
DOTNET_ENVIRONMENT
- 値に
Development
- 名前に
- プロジェクトディレクトリの
appsettings.json
を同じディレクトリにコピペし、appsettings.Development.json
を作る -
appsettings.json
とappsettings.Development.json
それぞれ、[出力ディレクトリにコピー]を[新しい場合はコピーする]に変更する
コード側
var env = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT") ?? string.Empty;
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json") //appsettings.jsonは必須
.AddJsonFile($"appsettings.{env}.json", true) //ppsettings.Development.jsonなどはオプション
.Build();
これでappsettings.json
よりもappsettings.{env}.json
が優先されます。
もしappsettings.{env}.json
が無かったり、環境変数がセットされていなければappsettings.json
が使われます。
余談
Gitなどバージョン管理を行う際にも便利になります。(ただし開発者が一人である場合のみ。)
設定ファイルがアプリケーションに必須の場合は、バージョン管理に登録する事になります。
しかし、設定ファイルに接続文字列やパスワードなどを書く必要があると、設定ファイルの内容がバージョン管理されるため、秘匿するべき内容がバージョン管理システムから見えてしまいます。
どうする
ファイル別に下記のように設定します。
ファイル | バージョン管理 | 内容 |
---|---|---|
appsettings.json |
する | サンプル設定だけ |
appsettings.Development.json |
しない | ローカルや開発環境の設定 |
appsettings.Production.json |
しない | 本番環境の設定 |
おわりに
ASP.NET Coreがどうしてるかはめんどくさいしソース読みたくないので知らん。
秘匿情報は環境変数に埋め込む方がいいかも。