2012-01-05 12 views
6

odio duplicar prácticamente preguntas existentes, pero las respuestas suministradas no he trabajado:¿Cómo puedo excluir los archivos SVN de la recolección con calor (WiX)?

Aquí es lo que mis .wxs parece:

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
<Fragment> 
<DirectoryRef Id="SDKCONTENTDIR"> 
<Directory Id="dirE2EC21E8B765C611E918FB22F30721D1" Name=".svn" /> 
<Directory Id="dir7DC42F44E7FE9E20277B180A353D0263" Name="bin" /> 
</DirectoryRef> 
</Fragment> 
<Fragment> 
<ComponentGroup Id="sdkContent"> 
<Component Id="cmp5E86312F0CA2C53B8173AECD6A428747" Directory="dirE2EC21E8B765C611E918FB22F30721D1" Guid="{E87F312D-9DA2-4A68-B6C5-BCE2FF90720C}"> 
<File Id="filB766A28A7577EB4311FD03CD707BC211" KeyPath="yes" Source="$(var.publishContentDir)\.svn\all-wcprops" /> 
</Component> 
<Component Id="cmp6EF52B3E331F226299060D45F533DC07" Directory="dirE2EC21E8B765C611E918FB22F30721D1" Guid="{5EA6AB2D-20C3-4B07-8E0A-7C28135BE922}"> 
<File Id="fil83205196F05211A66F9D25A7A5496FBA" KeyPath="yes" Source="$(var.publishContentDir)\.svn\entries" /> 
</Component> 

...

estoy usando este .xsl código de excluir:

<xsl:key name="svn-search" match="wix:Component[ancestor::wix:Directory/@Name = '.svn']" use="@Id" /> 
<xsl:template match="wix:Directory[@Name='.svn']" /> 
<xsl:template match="wix:Component[key('svn-search', @Id)]" /> 

Pero estoy consiguiendo muchos "Error 48 referencia sin resolver al símbolo" errores ya que no es la eliminación de todos los niños elementos.

Ideas?

Respuesta

4

Aquí es lo que tengo trabajo:

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"> 

    <!-- Copy all attributes and elements to the output. --> 
    <xsl:template match="@*|*"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*" /> 
      <xsl:apply-templates select="*" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:output method="xml" indent="yes" /> 

    <!-- Create searches for the directories to remove. --> 
    <xsl:key name="svn-search" match="wix:Directory[@Name = '.svn']" use="@Id" /> 
    <xsl:key name="tmp-search" match="wix:Directory[@Name = 'tmp']" use="@Id" /> 
    <xsl:key name="prop-base-search" match="wix:Directory[@Name = 'prop-base']" use="@Id" /> 
    <xsl:key name="text-base-search" match="wix:Directory[@Name = 'text-base']" use="@Id" /> 
    <xsl:key name="props-search" match="wix:Directory[@Name = 'props']" use="@Id" /> 

    <!-- Remove directories. --> 
    <xsl:template match="wix:Directory[@Name='.svn']" /> 
    <xsl:template match="wix:Directory[@Name='props']" /> 
    <xsl:template match="wix:Directory[@Name='tmp']" /> 
    <xsl:template match="wix:Directory[@Name='prop-base']" /> 
    <xsl:template match="wix:Directory[@Name='text-base']" /> 

    <!-- Remove Components referencing those directories. --> 
    <xsl:template match="wix:Component[key('svn-search', @Directory)]" /> 
    <xsl:template match="wix:Component[key('props-search', @Directory)]" /> 
    <xsl:template match="wix:Component[key('tmp-search', @Directory)]" /> 
    <xsl:template match="wix:Component[key('prop-base-search', @Directory)]" /> 
    <xsl:template match="wix:Component[key('text-base-search', @Directory)]" /> 

    <!-- Remove DirectoryRefs (and their parent Fragments) referencing those directories. --> 
    <xsl:template match="wix:Fragment[wix:DirectoryRef[key('svn-search', @Id)]]" /> 
    <xsl:template match="wix:Fragment[wix:DirectoryRef[key('props-search', @Id)]]" /> 
    <xsl:template match="wix:Fragment[wix:DirectoryRef[key('tmp-search', @Id)]]" /> 
    <xsl:template match="wix:Fragment[wix:DirectoryRef[key('prop-base-search', @Id)]]" /> 
    <xsl:template match="wix:Fragment[wix:DirectoryRef[key('text-base-search', @Id)]]" /> 
</xsl:stylesheet> 
+2

Tuve problemas con la solución cuando hay subdirectorios debajo de .svn. Además, ComponentRefs no se eliminan. – tofutim

0

Aparece el error "símbolo no resuelto" porque filtra los elementos del Componente, pero deja los elementos ComponenteRef tal como están. Por lo tanto, esos elementos permanecen huérfanos y hacen referencia a elementos componentes faltantes. Esto queda atrapado por el compilador de WiX.

Como probablemente ya haya adivinado, filtre también los elementos correspondientes de ComponentRef. Espero que esto ayude.

+0

Sí, hay elementos huérfanos, pero el problema es que no puedo encontrar la manera de filtrarlos. No hay elementos ComponentRef en los .wxs de Heat. De hecho, los elementos del Componente son huérfanos desde que se está filtrando el directorio .svn de nivel superior. El svn-search no parece funcionar correctamente, pero no puedo determinar por qué. – jbierling

19

que tenían la misma pregunta, y encontré la respuesta. Sin embargo, no estaba contento con la necesidad de especificar los subdirectorios de la carpeta .svn por nombre. Esto puede romperse si el directorio .svn cambia la estructura en el futuro, o si tuviera un directorio llamado tmp a propósito ...

Cuando ejecuté su xsl contra mi xml, también noté que había algunos fragmentos de directorio dispersos alrededor. Al ser TOC y querer limpiar eso, noté que heat.exe tiene una opción para "suprimir fragmentos". El efecto real fue hacer que las etiquetas de Directorio realmente anidan una debajo de la otra, lo que hace que escribir un archivo xsl sea mucho más fácil.

Después de eliminar los directorios .svn de la estructura de etiquetas anidadas, todavía tenía un problema con ComponentRefs que apuntaba a identificadores de componentes que se habían eliminado junto con los directorios que los contenían. Como soy un novato xsl, tuve que investigar un poco, pero descubrí que podía usar "descendiente ::" en el atributo de uso de xsl: clave.

En resumen, esta es mi solución. Tenga en cuenta que aún no he intentado construir el MSI con eso; eso llegará en un día o dos. Pero incluso si no es perfecto, al menos, esto podría ayudar a alguien con el mismo problema ...

Uso: fuente dir heat.exe -t excludesvn.xsl -sfrag -o files.wxs

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"> 
    <!-- Copy all attributes and elements to the output. --> 
    <xsl:template match="@*|*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*" /> 
     <xsl:apply-templates select="*" /> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:output method="xml" indent="yes" /> 

    <!-- Search directories for the components that will be removed. --> 
    <xsl:key name="svn-search" match="wix:Directory[@Name = '.svn']" use="descendant::wix:Component/@Id" /> 

    <!-- Remove directories. --> 
    <xsl:template match="wix:Directory[@Name='.svn']" /> 

    <!-- Remove componentsrefs referencing components in those directories. --> 
    <xsl:template match="wix:ComponentRef[key('svn-search', @Id)]" /> 
</xsl:stylesheet> 
+1

Guau, para un "novato" esto es bueno, especialmente con la tecla 'svn-search'. ¡Bravo! Oh, '' es lo mismo que sus dos líneas explícitas 'apply-templates'. –

+1

La solución está en lo cierto. -sfrag es la clave. – tofutim

+0

Para la clave 'svn-search', también puede usar' '. Este XPath coincide con el wix: Componente con un wix: Ancestro del directorio que tiene el nombre '.svn'. Consulte [XPath Syntax] (http://msdn.microsoft.com/en-us/library/ms256471 (v = vs.85) .aspx) para obtener más información. – MageWind

Cuestiones relacionadas