さまざまな環境の構成を生成するために、以下の投稿で説明するweb.config変換を使用しています。
http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html
キーを照合することで「置換」変換を行うことができます。
<add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" />
そして、「挿入」を行うことができます。
<add key="UseLivePaymentService" value="true" xdt:Transform="Insert" />
しかし、私が本当に有用だと思うのはReplaceOrInsert変換です。特定のキーを持つ/持たない元の設定ファイルに常に頼ることはできません。
これを行う方法はありますか?
安価な回避策を見つけました。 「Replace Or Insert」にする必要のある要素がたくさんある場合、それはきれいではなく、うまく機能しません。
「削除」を実行してから、「InsertAfter | InsertBefore」を実行します。
例えば、
<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertAfter(/configuration/system.web/authentication)">
<deny users="?"/>
<allow users="*"/>
</authorization>
xdt:Transform="Remove"
と組み合わせて、VS2012でxdt:Transform="InsertIfMissing"
を使用します。
<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertIfMissing">
<deny users="?"/>
<allow users="*"/>
</authorization>
InsertIfMissing
変換を使用して、appSettingが存在することを確認します。
次に、Replace
変換を使用してその値を設定します。
<appSettings>
<add key="Environment" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
<add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" />
</appSettings>
SetAttributes
の代わりにReplace
変換を使用することもできます。違いは、SetAttributes
は子ノードに触れないことです。
<appSettings>
<add key="UseLivePaymentService" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
<add key="UseLivePaymentService" value="true" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
</appSettings>
既存のノードは親ノードの下部に移動されないため、これらの手法はremove + insertよりもはるかに優れています。新しいノードは最後に追加されます。既存のノードは、ソースファイル内の場所に残ります。
この回答は、Visual Studioの新しいバージョン(2012以降)にのみ適用されます。
私にとってより良い方法は、特定の属性のみを設定しているため、要素が存在しない場合にのみ要素を挿入することでした。要素を削除すると、メイン要素の他の属性が存在する場合、それらはすべて破棄されます。
例:web.config(要素なし)
<serviceBehaviors>
<behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
web.config(要素付き)
<serviceBehaviors>
<behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior">
<serviceDebug httpsHelpPageEnabled="true" />
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
LocatorとXPath式を使用して、ノードが存在しない場合は追加し、属性を設定します。
<serviceDebug xdt:Transform="Insert"
xdt:Locator="XPath(/configuration/system.serviceModel/behaviors/serviceBehaviors/behavior[not(serviceDebug)])" />
<serviceDebug includeExceptionDetailInFaults="true" xdt:Transform="SetAttributes" />
生成された両方のweb.configファイルにはincludeExceptionDetailInFaults = "true"があり、2番目のファイルでは、remove/insertメソッドでは保持されなかったhttpsHelpPageEnabled属性が保持されます。
以下は、同じキーが存在しない場合に新しいキーを作成します。存在する場合は、既存のものを単に置き換えます。
<add key="some key" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)"/> <add key="some key" value="some value" xdt:Transform="Replace" xdt:Locator="Match(key)" />