ASP.NET MVCで環境依存の設定

よくあるproduction、staging、development的な環境依存の設定をASP.NETではどう書くの?という話。

Visual Studio 2010のソリューションエクスプローラーからWeb.configを見てみると、Web.Debug.configとWeb.Release.configがぶら下がって見えるんで、どうやらそんな感じで環境依存の設定をかけるっぽいね。で、具体的にどうやって書くんだろう?

Web アプリケーション プロジェクト配置の Web.config 変換構文

がその肝らしいな。.NET Framework 4って書いてあるから、これってVisual Studio 2010以降に追加された機能なのかな? それ以前はどうやっていたんだろう?

ともかく肝としては、

Locator 属性で、なんらかの方法で変更する Web.config の 1 つまたは一連の要素を指定します。 Transform 属性で、Locator 属性によって見つけられた要素に対し実行する操作を指定します。

ということらしい。仕様をまとめると、

  • 記述されたノード+xdt:Locatorという属性によって、設定値が置き換えられるターゲットを指定する
    • Condition(XPath expression)で、カレントノードからの相対XPath指定
    • Match(attrname)でカレントノード以下のノードで、指定された属性名(attrname)にマッチ(完全一致)するターゲットを指定。属性名はカンマ区切りで列挙可能
    • XPath(XPath expression)で、絶対XPath指定
    • Locatorが省略された場合は、そのノード自体が指定されたことになる
  • xdf:Transformという属性で、設定の置き換え方法を指定する
    • Replaceで単純置き換え。複数のターゲットにマッチした場合は最初の一つだけ置き換え
    • Insertで兄弟ノードとして末尾に追加
    • InsertBeforeで指定要素の直前に追加
    • InsertAfterで指定要素の直後に追加
    • Removeで指定要素を削除。複数のターゲットにマッチした場合は最初の一つだけ削除
    • RemoveAllですべての指定要素を削除
    • RemoveAttributesで指定した属性を削除。属性はカンマ区切りで複数指定可能
    • SetAttributesで指定した属性値を設定。

って感じ。

単純に環境ごとに違うDB接続設定を使いたいような場合は、環境ごとのDB接続設定をそれぞれ記述して、xdt:Transform=”Replace”にしておけば丸ごと変更される。環境ごとにソフトウェアロードバランスするDBを追加したい場合なんかは、Insertで追加したりするんだろう。

具体的に別の環境設定を追加したい場合は、「構成マネージャー」から新しい環境を追加し、さらにWeb.configから「構成変換の追加」を実行すると、Web.[新しい構成名].configファイルが追加される。

ということで、試しにProductionという構成を追加して、Web.Production.configにDB接続先の設定変更を行い、Production設定でVisual Studioからビルド&実行してみたんだけど、特に何も変わらない。どゆこと?

試しに最初からあるDebugとかReleaseとかを書き換えてみたが、それでも特に変わっている様子がない。いろいろ試行錯誤した結果、このWeb.configの書き換えはVisual Studioからビルド&実行したときには行われないようだ。

「Webの発行」から適当なディレクトリに発行を行ってみたところ、ちゃんとWeb.Debug.configで書き換えた設定が反映された。でも、自前で追加したWeb.Production.configに関しては、Productionビルドして発行する設定を行っても、特に設定変更が反映されない。

方法: Web.confg の変換を無効にする」にある設定変更を反映させない方法のどれかが有効になっているんじゃないかと思ったけど、特にどれも問題がなかった。これ、自前で追加したビルド構成の設定変更を反映させるにはどうすればいいんだ?

と疑問に思うが、ひとまず目先はDebug、Releaseの二つの設定変更が有効に働いてくれれば問題がないので、これ以上の深追いはやめる。こんなしょうもないことを調べるのにもずいぶん時間がかかっているし。

関連する投稿:

    None Found