コンソールアプリやWPFアプリを作っていて、アプリのコードは同一だけど配置先に応じて設定を切り替えたい、ということはないでしょうか?Webアプリの場合、 Web.config を変換する仕組みがデフォルトで備わっていて、このブログでも触れたことがあります。
Web発行先に応じたconfig変換をコマンドラインでのビルドで適用する ~既知のバグもあるよ~ - 銀の光と碧い空
ところが、コンソールアプリなどで使われる App.config についてはこのような機能がありません。同様の仕組みを実現するために、ビルドイベントでファイルをいじったり、自前でビルドタスクを書いたり...といろいろな方法がWeb上にはあります。
が、今回紹介する「Config Transform」というVS拡張はほかのものと比べてかなり便利な機能が備わっています。
Configuration Transform extension
個人的に便利だと思っているのは以下の3点です。
- 拡張機能を使うと、csproj を編集してビルドタスクを作成するので、この拡張機能に依存しない形で展開可能(CIサーバーなどこの拡張機能がない環境でもビルドできる)
- ビルド構成ごとのconfig 変換ファイルを自動生成
- config のPreviewもついている
一番大きいのが最初の点ではないでしょうか?自分だけがさわる環境ならともかく、CIサーバーなどを用意して共同開発して自動で展開するような環境だと、VS拡張がないとビルドできない、というものだとなかなか厳しいものがあります。しかし、この Config Transformは App.config の変換を有効にすると、csproj を編集してビルドタスクを新たに作成するため、以降はこのVS拡張がなくてもconfig変換機能が有効になります。
ただ、注意点としては、変更後のcsprojを見ると下記のように、Microsoft.Web.Publishing.Tasks.dll を参照しているのでこのdllが必要そうです。このdllを配置するおそらく一番簡単な方法は、Visual Studio Pro以上もしくはExpress for Web をインストールすることかと思われます。
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
使い方は上のリンクのVS拡張のページに図入りであるので、すぐわかると思います。App.config を右クリックして「App Config Transforms」を選ぶと、ビルド構成に応じたApp.XXX.config が作成されます(XXXはDebugとかReleaseとか)。したがって配置する場所ごとにconfigを差し替えたい時は、配置先に応じたビルド構成を作成する必要があります*1。
たとえば、ありがちな AppSettingsを差し替えたい場合はこうなるでしょう。 元のApp.configがこうなっていまして、
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <appSettings> <add key="Hoge" value="Fuga"/> </appSettings> </configuration>
変換用のApp.Release.configをこう定義しますと
<?xml version="1.0"?> <!-- For more information on using app.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 --> <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <appSettings xdt:Transform="Replace"> <add key="Piyo" value="NewValue!"/> <add key="Poyo" value="NewValue!!"/> </appSettings> </configuration>
こういうふうに変換されます。(この結果はPreview機能で元のファイルとの差分としてVS上で確認可能)
<?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <appSettings> <add key="Piyo" value="NewValue!" /> <add key="Poyo" value="NewValue!!" /> </appSettings> </configuration>
こんな感じでなかなか便利です。
*1:発行先ごとに設定できるWeb.configと比べてちょっと面倒くさいけど、VSの仕様なのでしょうがない