.NET Coreのコンソールアプリケーションで他プロジェクトと共通の構成ファイル(appsettings.json)を利用する
.NET Coreのコンソールアプリケーションで各プロジェクト共通の構成ファイル(appsettings.json)を読み込む方法についてです。一つのシステムでASP.NET Coreで作成したWebアプリケーションとコンソールアプリケーションがあったので、同じ構成ファイルを利用するようにしたら変更時の手間が省けて楽になりました。
確認しているASP.NET Coreのバージョンは2.0になります。
目次
- コード
- 本番環境(Linux)での実行方法
- 参考リンク
コード
共通の構成ファイルと、各プロジェクトの構成ファイルの置き場所は以下の通りとします。
AppSolution ├ WebApplication │ ├ program.cs │ ├ Startup.cs │ ├ appsettings.json │ └ appsettings.Development.json │ ├ ConsoleApplication │ ├ program.cs │ ├ appsettings.json │ └ appsettings.Development.json │ ├ appsettings.json └ appsettings.Development.json
AppSolution直下の共通の構成ファイルと、ConsoleApplicationプロジェクト直下の構成ファイルを読み込む方法は以下の通り。
var environmentName = Environment.GetEnvironmentVariable("NETCORE_ENVIRONMENT");
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(Path.GetFullPath(Path.Combine(@"../appsettings.json")), optional: true, reloadOnChange: true)
.AddJsonFile(Path.GetFullPath(Path.Combine($@"../appsettings.{environmentName}.json")), optional: true, reloadOnChange: true)
.AddJsonFile(Path.GetFullPath(Path.Combine("appsettings.json")), optional: true, reloadOnChange: true)
.AddJsonFile(Path.GetFullPath(Path.Combine($"appsettings.{environmentName}.json")), optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
var configuration = builder.Build();
Console.WriteLine($"DbConnectionString = {configuration["App:DbConnectionString"]}");
Console.WriteLine($"ImageSharedUrl = {configuration["App:Url:ImageSharedUrl"]}");
Console.WriteLine($"ArticleContentUrl = {configuration["App:Url:ArticleContentUrl"]}");
上記のコードはAddJsonFile()ですべての構成ファイルを順番に追加しているだけです。
引数はファイルパスと、optionalは構成ファイルが必須かどうか、reloadOnChangeは構成ファイルに変更あった場合の再読み込みフラグで、読み込んだ構成ファイルに同じキーが合った場合は後勝ちになります。
ASP.NET Coreアプリケーションの場合、デフォルトの起動処理で「WebHost.CreateDefaultBuilder()」が使われており、自動でプロジェクト直下の構成ファイルを読み込んでくれますが、コンソールアプリケーションでそういった処理はないので、上記のようなコードとなっています。
「NETCORE_ENVIRONMENT」は環境変数になるので、本番環境がLinuxであれば、シェル変数を「export」して環境変数にしてからコンソールアプリケーションを実行すると、アプリケーション内で参照してくれます。
本番環境(Linux)での実行方法
実際にLinuxでコンソールアプリケーションを実行する際のシェルスクリプトの例は以下の通り。
NETCORE_ENVIRONMENT=Production
export NETCORE_ENVIRONMENT
dotnet ./ConsoleApplication.dll
環境変数が読み込めているかどうかは、.NETアプリ側で「Console.WriteLine()」などを利用して読み込んだ情報を出力してみると分かります。