web-dev-qa-db-ja.com

web.config変換を使用して「置換または挿入」を行う方法はありますか?

さまざまな環境の構成を生成するために、以下の投稿で説明する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変換です。特定のキーを持つ/持たない元の設定ファイルに常に頼ることはできません。

これを行う方法はありますか?

166
Chris Haines

安価な回避策を見つけました。 「Replace Or Insert」にする必要のある要素がたくさんある場合、それはきれいではなく、うまく機能しません。

「削除」を実行してから、「InsertAfter | InsertBefore」を実行します。

例えば、

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertAfter(/configuration/system.web/authentication)">
  <deny users="?"/>
  <allow users="*"/>
</authorization>
101
an phu

xdt:Transform="Remove"と組み合わせて、VS2012でxdt:Transform="InsertIfMissing"を使用します。

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertIfMissing">
  <deny users="?"/>
  <allow users="*"/>
</authorization>
115
ADW334034

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以降)にのみ適用されます。

72
Steven Liekens

私にとってより良い方法は、特定の属性のみを設定しているため、要素が存在しない場合にのみ要素を挿入することでした。要素を削除すると、メイン要素の他の属性が存在する場合、それらはすべて破棄されます。

例: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属性が保持されます。

7
Dan

以下は、同じキーが存在しない場合に新しいキーを作成します。存在する場合は、既存のものを単に置き換えます。

<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)" />