web-dev-qa-db-fra.com

Transformations de configuration Web: insérer si ce n'est pas le cas

Je voudrais appliquer une transformation si et seulement si un élément correspondant n'existe pas dans la cible. Essayer différentes expressions xpath en utilisant http://webconfigtransformationtester.apphb.com/ mais pas de chance jusqu'à présent.

Par exemple. si le fichier web.config cible ressemble à ceci:

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

alors la sortie devrait ressembler à ceci:

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

Mais si la cible ressemble à ceci:

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

alors le résultat de la transformation devrait ressembler à ceci:

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

En d'autres termes, je veux simplement ajouter la chaîne de connexion nommée à la configuration mais laisser l'administrateur la remplir avec ses propres valeurs. Je pensais que ce serait aussi simple que xdt:Transform="Insert" xdt:Locator="XPath(count(/configuration/connectionStrings)=0)" (pour ajouter une section de configuration cs s'il n'en existait pas) mais apparemment pas.

44
João Bragança

Utilisation xdt:Transform="InsertIfMissing" avec la tâche XmlTransform dans VS2012. Il ne semble pas que Microsoft ait mis à jour sa documentation pour refléter cela.

55
ADW334034

Dans mon cas, xdt:Transform="InsertIfMissing" Ne fonctionnait pas sans xdt:Locator="Match(name)"

34
GerardBeckerleg

Essayez cette transformation alternative pour 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>

Cela devrait fonctionner après documentation MSDN :

Insérer ajoute l'élément défini dans le fichier de transformation en tant que frère à l'élément sélectionné ou des éléments. Le nouvel élément est ajouté à la fin de toute collection.

Donc, si le nœud existe déjà, nous ajoutons le deuxième puis supprimons ce nœud (2e). Sinon, nous ajoutons le nouveau nœud unique mais l'opération de suppression échouera.

Remarque: Il semble ne pas fonctionner avec la transformation NuGet *. (Un) install.xdt. InsertIfMissing aussi.

11
Kryszal

Fonctionnement confirmé dans VS2015 et la version 3.4.4.1321 de l'hôte de la console du gestionnaire de packages (vous pouvez le trouver lorsque vous ouvrez la console du gestionnaire de packages).

Ceci sera inséré si 'configuration\connectionStrings\add\@name' n'existe pas.

Le fichier 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>

Le fichier .nuspec:

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

Utilisation xdt:Transform="Remove" suivi par xdt:Transform="Insert" se transforme. Le xdt:Transform="InsertIfMissing" suggéré ailleurs ne fonctionnait pas pour moi, ressemble à sa version spécifique.

4
Taras Alenin