2012-10-09 32 views
6

Usted puede leer web.config transforma documentación here y there, pero hay dos blancos elefantes que nadie parece discutir:Web.config transforma - el manual de falta

  1. ¿Cómo se realiza una sustitución de variables en un Condition o XPath transformada, y ...
  2. Puede un Locator ser significativa anidado dentro de un Transform?

Déjeme dar un ejemplo que se beneficiaría de cualquiera de esas opciones. Supongamos que tengo esto:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> 
    </dependentAssembly> 
    <dependentAssembly> 
     <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" /> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

Supongamos que quiero borrar por completo el nodo dependentAssembly, y sus hijos, que coincide con el XPath //runtime/assemblyBinding/dependentAssembly[[email protected]='System.Web.Mvc']. Para hacer eso, puede ser que quiera algo como esto:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity 
      name="System.Web.Mvc" 
      xdt:Remove 
      xdt:Locator="Condition(..[*@name=$name])" 
     /> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

Bueno, obviamente que compone la sintaxis @name=$name basado en xpath variable concepts, pero este ejemplo demuestra por qué me gustaría que esa característica. ¿Esto es compatible? ¿Cómo debo ajustar mi sintaxis para aprovechar esto? Podría poner una cadena literal, pero solo quiero saber si esto es posible.

Otra forma podría tratar de eliminar el nodo dependentAssembly, es decir con esto:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" xdt:Transform="Remove"> 
    <dependentAssembly> 
     <assemblyIdentity name="System.Web.Mvc" xdt:Locator="Match(name)" /> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

Aviso del Transform está en un nodo Grand-padres, y el localizador es el nodo hoja. ¿Es lo anterior legítimo? La idea es eliminar solo el nodo dependantAssembly que tiene una coincidencia de localizador interno.

Dejando a un lado estos dos enfoques, ¿cómo eliminaría la segmentación dependantAssembly y todos sus nodos secundarios?

Respuesta

6

@ solución de Thommy trabajó para mí, y @ solución de LifeintheGrid utiliza los montajes reales que quería eliminar, por lo que combina los dos y simplificado para conseguir :

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly xdt:Transform="RemoveAll" 
          xdt:Locator="Condition(starts-with(./_defaultNamespace:assemblyIdentity/@name,'Microsoft.VisualStudio.QualityTools'))"> 
     </dependentAssembly> 
    </assemblyBinding> 
</runtime> 
3

Este código terminó funcionando para mí. Moví la transformación al nodo dependiente del ensamblaje.

<runtime> 
    <assemblyBinding> 
    <!-- ending /dependentAssembly is required or tranforms fail --> 
    <dependentAssembly xdt:Transform="Remove" xdt:Locator="Condition(assemblyIdentity/@name='Microsoft.VisualStudio.QualityTools.HostAdapters.ASPNETAdapter')" ></dependentAssembly> 
    <dependentAssembly xdt:Transform="Remove" xdt:Locator="Condition(assemblyIdentity/@name='Microsoft.VisualStudio.QualityTools.Common')" ></dependentAssembly> 
    <dependentAssembly xdt:Transform="Remove" xdt:Locator="Condition(assemblyIdentity/@name='Microsoft.VisualStudio.QualityTools.ExecutionCommon')"></dependentAssembly> 
    <dependentAssembly xdt:Transform="Remove" xdt:Locator="Condition(assemblyIdentity/@name='Microsoft.VisualStudio.QualityTools.Resource')" ></dependentAssembly> 
    </assemblyBinding> 
</runtime> 
7

El problema es el atributo de espacio de nombres en la etiqueta assemblyBinding.

Extracción de las obras de referencia AspNetHelper para mí con esto:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly xdt:Transform="Remove" 
          xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='Microsoft.VisualStudio.Enterprise.AspNetHelper')"> 
     </dependentAssembly> 
    </assemblyBinding> 
</runtime> 
+0

Esto funcionó y debe marcarse como la respuesta a esta pregunta. – sebastiaan