Component/@NeverOverwrite="yes"
farà questo. Ricorda semplicemente di impostare File/@KeyPath="yes"
su uno o più file in modo che possa rilevare se è già presente.
Se si utilizza heat.exe per raccogliere automaticamente l'elenco di file, è possibile utilizzare il seguente foglio di stile XSLT per impostare questo attributo su ciascun componente contenente un file di configurazione (e impostare ciascun elemento File di configurazione come percorso chiave).
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
exclude-result-prefixes="msxsl wix">
<xsl:output method="xml" indent="yes" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//*[local-name()='Component']">
<wix:Component Id="{@Id}" Directory="{@Directory}" Guid="{@Guid}">
<xsl:if test="contains(*[local-name()='File']/@Source, '.config')">
<xsl:attribute name="NeverOverwrite">yes</xsl:attribute>
</xsl:if>
<xsl:apply-templates select="@* | node()"/>
</wix:Component>
</xsl:template>
<xsl:template match="@KeyPath">
<xsl:choose>
<xsl:when test="contains(parent::node()/@Source, '.config')">
<xsl:attribute name="KeyPath">
<xsl:value-of select="'yes'"/>
</xsl:attribute>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
(Nota: la gestione namespace XML può probabilmente essere ripulito, ma funziona.)
fonte
2011-09-13 14:55:23
Bella idea. Ma questo non funziona nel mio scenario: non posso modificare il codice dell'app. – forki23
Sembra che tu abbia accettato la risposta sbagliata, amico :) Dave Andersen ha proposto una buona soluzione per il tuo caso. –
@Yan Infatti, anche se in mia difesa la mia risposta è stata molto più tempestiva ... –