読者です 読者をやめる 読者になる 読者になる

銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

App.config の config変換をしてくれる便利すぎるVisual Studio 拡張「Configuration Transform」

コンソールアプリや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の仕様なのでしょうがない