やりたいこと
ASP.NET無印、及びASP.NET Coreで発行プロファイルに応じてWeb.Configの設定値を書き変えて発行します。
発行プロファイルではDB接続文字列については個人単位に切り替えながら(*.pubxml.userを使って)運用できますが、それ以外の設定値も同様のやり方で自動的に切り替られればとても便利です。
また、個人用のテスト環境についての設定はgit管理から除外できると良いでしょう。
前提
ASP.NETの発行プロファイルを切り替えて運用しているケースは多いかと思います。
- local_profile.pubxml(ローカルテスト用プロファイル)
- test_shared_profile.pubxml(共有テスト環境用プロファイル)
- production_profile.pubxml(本番環境用プロファイル)
ここで、ログインページに表示するサイト名をWeb.ConfigのappSettingsに保持しているとします。
(実際にはログ出力先やサービスの為のキー情報など、いろんな重要な情報を保持すると思いますが、ここではわかりやすさの為にサイト名を扱っています)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="websitename" value="〇〇システム" />
</appSettings>
</configuration>
これを発行プロファイルに応じて自動的に置き換えるには次のようにします。
手順
Web.<プロファイル名>.Config を作る
Web.Configと同じ場所に、Web.<プロファイル名>.Config というファイルを作ります。
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="websitename"
value="〇〇システム(ローカルテスト用)"
xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>
</configuration>
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="websitename"
value="〇〇システム(共用テスト環境)"
xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>
</configuration>
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="websitename"
value="〇〇システム"
xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>
</configuration>
上記のファイルの中身は「Config変換」と言われるものです。
https://docs.microsoft.com/ja-jp/aspnet/core/host-and-deploy/iis/transform-webconfig?view=aspnetcore-5.0#profile
いろんな方法がありますが、上記では「xdt:Transform="SetAttributes"」という指定によって属性値を置換する指示を行っています。
また、「xdt:Locator="Match(key)"」という指定によって、「key属性が一致する要素のみにこれを適用するよう指示しています。
ここでいう「key」とは、"websitename"のことです。このkeyが一致する要素について、属性を全て上書きするというものです。ここでは属性はvalueのみとなっています。
他にもいろんな変換指示方法があるようですが、とりあえず上記を知っていればほとんどの場面に対応可能かと思います。
あとは、プロファイルを選んで「発行」すれば、上記のConfig変換が行われた後のWeb.Configが発行されます。
ASP.NET Core 5.0用の説明ページに書かれていた内容ですが、ASP.NET 5無印でも動作しました。
gitでWeb.local_profile.Configを除外
gitでローカル設定がリポジトリで共有されてしまうと、開発者ごとに毎回上書きされてしまって面倒になりますので、.gitignoreで除外しておきましょう。
共用テスト環境や本番環境のWeb.Configは固定のはずですから、リポジトリで管理すればよいと思います。
おまけ:プログラムからの値の読み取り
using using System.Configuration;
:
string value = ConfigurationManager.AppSettings["websitename"];