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


183

さまざまな環境の構成を生成するために、以下の投稿で説明されているように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変換本当に役立つと思います。

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


指定したリンクは現在機能していません。コンセプトを簡単に理解できるリンクは他にありますか?
Ashish-BeJovial

@AshishJainリンクは私にとってはうまく機能しています
Chris Haines

回答:


105

安い回避策を見つけました。「置換または挿入」する必要のある要素が多数ある場合、これはかなり美しくなく、うまく機能しません。

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

例えば、

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

17
VS2012を使用している場合、より良い解決策があります。以下を参照してください。stackoverflow.com/ a / 16679201/32055
Chris Haines

1
「InsertIfMissing」は必要に応じて挿入および置換しますか?
ジェシー2014

InsertAfterを使用したおかげで、私は他のオプションよりもこのオプションを好みます。とにかく削除を実行している場合、InsertIfMissingは意味がありません。
シェーンコートリル

125

VS2012 でのxdt:Transform="Remove"使用xdt:Transform="InsertIfMissing"と組み合わせて。

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

パーフェクト!これが私たちが待ち望んでいたことです。
クリスヘインズ2013年

9
これは、OPリクエストとしてはまったく機能しません。
BradLaney 2014年

2
回答は、元の質問にどのように回答するかをより明確に示すために編集されました。
Bon

25
わかりません。削除すると、もちろん失われますが、その時点では単なる挿入ですよね?
Chad Schouggins、2014

6
@ChadSchougginsは必ずしも必要ではありませんRemove。タスクは最初の発生のみを削除します。一部の要素は複数のオカレンスを持つことができます。私はあなたがこれを望んでいるとは想像できませんが、最初の出現を削除してInsertIfMissingタスクをスキップします。しかし、彼がRemoveAll代わりに使用したなら、あなたは正しかったでしょう。
Steven Liekens、2015

89

使用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>

既存のノードは親ノードの最下部に移動されないため、これらの手法は削除+挿入よりもはるかに優れています。新しいノードは最後に追加されます。既存のノードは、ソースファイル内の場所に残ります。

この回答は、新しいバージョンのVisual Studio(2012以降)にのみ適用されます。


7

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

例: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>

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番目のファイルには、httpsHelpPageEnabled属性が保持されますが、remove / insertメソッドでは保持されません。


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

これは、new(ish) "InsertIfMissing"要素をサポートしないバージョンのXDTを使用している場合に必要な手法です。
IanBru
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.