C#でApp.configをビルドターゲット毎に分けたい


# 1. はじめに
* Javaのように設定ファイルを環境毎に分けて管理したい
* Visual Studio 拡張機能 ```Configuration Transform```が使えそうだが、Visual Studio 2022では使用できないため代替策を検討したい
* いろいろ調べた結果、今回はMicrosoft社の```SlowCheetah```を使用して実現したい

# 2. 開発環境
* C#
* .Net 6
* Visual Studio 2022
* Windows 11
* SlowCheetah (Visual Studio 拡張管理)
* Microsoft.VisualStudio.SlowCheetah (NuGet)

# 3. SlowCheetahのインストール
## 3.1. Visual Studioの```拡張機能``` > ```拡張機能の管理```を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/392e0bd2-4dd7-1f79-1b23-07848edee416.png)

## 3.2. 検索ウィンドウに```SlowCheetah```と入力して、ダウンロードボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/910d05f9-f2e2-496a-2e09-e5924889270e.png)

## 3.3. 画面下部の閉じるボタンをクリックして、Visual Studioを終了する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/840cbc46-c7f4-37b7-c579-266d18f1199b.png)

## 3.4. インストール画面が表示されたら、Modifyボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/1dd4810f-109d-c4e6-32fe-b8dc486ae6b5.png)

## 3.5. Closeボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/c9daf983-a2b4-d466-b837-37d1088f20db.png)

# 4. App.configの分割
## 4.1. ソリューションエクスプローラーよりApp.configを右クリックして、```Add Transform```を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/8c030c55-072e-97dd-75bf-c2e5308f834f.png)

## 4.2. NuGetパッケージのインストールの確認ダイアログが表示されたら、はいボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/fc507a63-5630-3124-da9b-45ee7bae34a5.png)

* NuGetの管理から```Microsoft.VisualStudio.SlowCheetah```がインストールされていることが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/1b12d704-bf79-ee0d-7600-7b4f4bdd6dd5.png)

## 4.3. 再度ソリューションエクスプローラーよりApp.configを右クリックして、```Add Transform```を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/c4b20ff6-6c66-f60d-6f82-0273d55dffd2.png)

## 4.4. App.configがビルドターゲット毎に分割される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/5de4b349-a88d-c6af-70a8-31803bc50045.png)

# 5. App.configのカスタマイズ例
## 5.1. ```App.config```（オリジナル）
```XML:App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<appSettings>
		<add key="Application Name" value="Debug Application" />
	</appSettings>
</configuration>
```

## 5.2. ```App.Release.config```
```XML:App.Release.config
<?xml version="1.0" encoding="utf-8"?>
<!--For more information on using transformations see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
	<appSettings>
		<!-- Application Name KeyのValueを置き換える -->
		<add key="Application Name" value="Release Application" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
		<!-- Application Version KeyのValueを追加する -->
		<add key="Application Version" value="1.0.0.0" xdt:Transform="Insert" xdt:Locator="Match(key)"/>
	</appSettings>
</configuration>
```
* 変換したい設定を記載して、値を書き換える
* Valueの最後に変換する内容を追記しておく
* 書き方はTransform、Locatorに変換する内容を記載する
    * ```Transform``` : Insert(追加) または Replace(変換）
    * ```Locator``` : Match(key) または Match(name)

## 5.3. ビルドターゲットのApp.configを確認する
* 確認したいApp.(ビルドターゲット).configを右クリックして、```Preview Transform```を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/96c8be1a-1880-3f0c-5950-2c817d5a3389.png)

* オリジナルのApp.configと変換後の差分が確認できる
    * 左側：オリジナル、右側：変換後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852081/b0c92242-af32-6f75-fd33-70fbbdb66138.png)

# 6. 参考文献

https://tech.tanaka733.net/entry/configuration-transform-visual-studio-extension

https://www.c-sharpcorner.com/article/configuration-transformation-2-app-config-slowcheetah/

https://marketplace.visualstudio.com/items?itemName=vscps.SlowCheetah-XMLTransforms