2013-02-27 5 views
38

Ich möchte eine Transformation anwenden, wenn und nur wenn ein übereinstimmendes Element nicht im Ziel vorhanden ist. Versuche verschiedene XPath-Ausdrücke mit http://webconfigtransformationtester.apphb.com/, aber bisher kein Glück.Web Config Transforms: Einfügen, wenn nicht vorhanden

z. wenn das Ziel web.config wie folgt aussieht:

<configuration> 
    <system.web> 
    <compilation debug="true" /> 
    </system.web> 
</configuration> 

dann sollte die Ausgabe wie folgt aussehen:

<configuration> 
    <connectionStrings> 
    <add name="MyCs" provider="System.Data.SqlClient" connectionString="" /> 
    <add name="SomeOtherCs" provider="System.Data.SqlClient" connectionString="" /> 
    </connectionStrings> 
    <system.web> 
    <compilation debug="true" /> 
    </system.web> 
</configuration> 

Aber wenn das Ziel wie folgt aussieht:

<configuration> 
    <connectionStrings> 
    <add name="MyCs" provider="System.Data.IChangedIt" connectionString="my connection string here" /> 
    </connectionStrings> 
    <system.web> 
    <compilation debug="true" /> 
    </system.web> 
</configuration> 

dann das Ergebnis der Transformation sollte wie folgt aussehen:

<configuration> 
    <connectionStrings> 
    <add name="MyCs" provider="System.Data.IChangedIt" connectionString="my connection string here" /> 
    <add name="SomeOtherCs" provider="System.Data.SqlClient" connectionString="" /> 
    </connectionStrings> 
    <system.web> 
    <compilation debug="true" /> 
    </system.web> 
</configuration> 

Mit anderen Worten, ich möchte nur die angegebene Verbindungszeichenfolge zur Konfiguration hinzufügen, aber den Administrator mit seinen eigenen Werten füllen. Ich dachte, es wäre so einfach wie xdt:Transform="Insert" xdt:Locator="XPath(count(/configuration/connectionStrings)=0)" (um eine CS Config-Sektion hinzuzufügen, wenn keine existierte), aber anscheinend nicht.

+0

haben Sie versucht, 'xdt: Locator = "XPath (/ Konfiguration [nicht (connection)])"'? – collapsar

+0

mögliches Duplikat von [Gibt es eine Möglichkeit, "Ersetzen oder Einfügen" mit der web.config-Umwandlung durchzuführen?] (Http://stackoverflow.com/questions/5732681/is-there-any-way-to-do-a -replace-oder-einfügen-mit-web-config-Transformation) –

Antwort

45

Verwenden Sie xdt:Transform="InsertIfMissing" mit der Aufgabe XmlTransform in VS2012. Es sieht nicht so aus, als ob Microsoft seine Dokumentation aktualisiert hat, um dies noch zu berücksichtigen.

+2

Ich benutze VS 2012 - und immer noch dies funktioniert nicht für mich :( –

+0

funktioniert nicht in VS2015 Community Edition – Avner

4

Verwenden Sie xdt:Transform="Remove" gefolgt von xdt:Transform="Insert" Transformationen. Die xdt:Transform="InsertIfMissing" vorgeschlagene anderswo funktionierte nicht für mich, sieht wie seine Version spezifisch aus.

+0

Wir sind immer noch auf 2010, so das funktioniert wirklich gut für uns! –

+0

Dies funktioniert wie ein Charme in VS 2012. Die in der angenommenen Antwort vorgeschlagene Methode warf Ausnahmen !! – dotnetguy

27

In meinem Fall xdt:Transform="InsertIfMissing" nicht funktionierte ohne xdt:Locator="Match(name)"

+0

Es kann sein, dass dies nur auf Blattknoten erforderlich ist –

+0

Das war was ich brauchte.Ich habe es versucht Um ein 'location' Tag für einen bestimmten Pfad einzufügen, hatte die ursprüngliche web.config bereits einige' location' Tags für andere Pfade, also musste ich einfach ein 'xdt: Locator =" Match (path) "Tag hinzufügen Ich weiß, es sieht komisch aus, aber in meinem Fall konnte ich das nicht zulassen bestimmter Speicherort in der ursprünglichen Konfiguration, nur bei der Veröffentlichung auf Servern. – Alisson

+0

Das war genau das, was ich brauchte - fügen Sie Schlüssel hinzu, aber ändern Sie nicht, wenn sie existieren. Ich brauchte die Transformation, den Locator und den Wert. Dies ist mit VS2015 – Archer

9

diese alternative Transformation testen xdt: Transform = "InsertIfMissing":

<?xml version="1.0"?> 
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 
    <nodeToInsertIfMissing xdt:Transform="Insert" /> 
    <nodeToInsertIfMissing xdt:Transform="Remove" xdt:Locator="XPath(/configuration/nodeToInsertIfMissing[2])" /> 
</configuration> 

Es sollte Werke nach MSDN documentation:

Einfügen - Fügt das Element hinzu, das in der Transformation definiert ist Datei als ein Geschwister zu dem ausgewählten Element oder den ausgewählten Elementen. Das neue Element ist am Ende einer beliebigen Sammlung hinzugefügt.

Also, wenn der Knoten bereits existiert, fügen wir den zweiten hinzu und entfernen dann diesen Knoten (2.). Andernfalls fügen wir den neuen eindeutigen Knoten hinzu, aber die Operation remove wird fehlschlagen.

Hinweis: Es scheint nicht mit NuGet *. (Un) install.xdt Transformation zu arbeiten. InsertIfMissing auch.

3

Bestätigte arbeiten in VS2015 und Package-Manager-Konsole Host Version 3.4.4.1321 (Sie können dies finden, wenn Sie die Package Manager-Konsole zu öffnen).

Dies wird einfügen, wenn ‚Konfiguration \ connection \ \ @name hinzufügen‘ existiert nicht.

Die app.config.install.xdt:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 
    <connectionStrings xdt:Transform="InsertIfMissing"> 
     <add name="MyCs" provider="System.Data.SqlClient" connectionString="" xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)"/> 
    </connectionStrings> 
</configuration> 

Die .nuspec Datei:

<files> 
    <file src="app.config.install.xdt" target="content\app.config.install.xdt" /> 
+1

Möglicherweise beachtenswert - Ich fand, dass dies fehlgeschlagen, wenn die app.config nicht bereits ein connectionStrings-Element enthalten, können Sie auch hinzufügen, dass xdt: Transform = "InsertIfMissing", um diesen Fall zu decken. –

+0

@JamesMorcom thx. Überholt. – OzBob