2011-04-20 23 views
133

私は、さまざまな環境用のコンフィグレーションを生成するために、以下の記事で説明するようにweb.config変換を使用しています。web.config変換を使用して「置換または挿入」を実行する方法はありますか?

http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html

Iは、例えば、キーを照合することによって、「置換」変換を行うことができ

<add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" /> 

また、「挿入」などもできます。私はいつも特定のキーを持っていない/持つオリジナルの設定ファイルに頼ることができないよう

<add key="UseLivePaymentService" value="true" xdt:Transform="Insert" /> 

しかし、私は本当にが有用見つけるだろうが、ReplaceOrInsert変換です。

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

答えて

89

安価な回避策が見つかりました。それはかなりではありませんし、 "置換または挿入"する必要がある要素がたくさんある場合、うまく機能しません。

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

例えば、

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

VS2012を使用している場合は、より良い解決策があります。下記を参照してください。http://stackoverflow.com/a/16679201/32055 –

+1

必要に応じてInsertIfMissingを挿入して置換しますか? – Jessycormier

7

私のためのより良い方法は、私が唯一の特定の属性を設定しておりますので、それが存在しない場合にのみ、要素を挿入することでした。要素を削除すると、主要素の他の属性があれば破棄されます。

例:(要素なし)のweb.config

<serviceBehaviors> 
    <behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
    </behavior> 
</serviceBehaviors> 

(エレメントを有する)のweb.config XPath式とロケータを使用

<serviceBehaviors> 
    <behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior"> 
     <serviceDebug httpsHelpPageEnabled="true" /> 
     <serviceMetadata httpGetEnabled="true" /> 
    </behavior> 
</serviceBehaviors> 

、それはdoesnの場合、私は、ノードを追加します存在し、次に私の属性を設定してください:

<serviceDebug xdt:Transform="Insert" 
    xdt:Locator="XPath(/configuration/system.serviceModel/behaviors/serviceBehaviors/behavior[not(serviceDebug)])" /> 
<serviceDebug includeExceptionDetailInFaults="true" xdt:Transform="SetAttributes" /> 

結果ウェブ。 configファイルにはIncludeExceptionDetailInFaults = "true"があり、2番目の設定ファイルでは削除/挿入メソッドでは使用できないhttpsHelpPageEnabled属性が保持されます。

+1

私はこのアイデアが好きですが、要素がすでに存在する場合はエラーが発生します。「ソースドキュメントの要素が一致しません...」つまり、それが存在する場合、「not」は失敗しているため、エラーです。 – goodeye

+0

これは、新しい(ish) "InsertIfMissing"要素をサポートしていないXDTのバージョンを使用しているときに必要な技術です。 – IanBru

105

xdt:Transform="Remove"と組み合わせて、VS2012にxdt:Transform="InsertIfMissing"を使用してください。

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

完璧!これが私たちが待っていたものです。 –

+0

同様の "InsertAfterIfMissing"はありますか? –

+14

しかし、このタグが既に存在する場合は置き換えられません。 –

50

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> 

また、代わりにReplaceSetAttributes変換を使用することができます。違いは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以降)の新しいバージョンにのみ適用されます。

0

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

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

関連する問題