2011-11-07 6 views
10

Estoy tratando de crear un instalador de WiX para un servicio de Windows, y he leído que quería establecer keyPath en "no" para todos mis archivos, con el excepción de .exe en mi script de WiX. estoy generando actualmente mi estructura de directorios y archivos utilizando Heat.exe aquí son órdenes:Instalador de WiX: utilizando xslt con heat.exe para actualizar los atributos

"$(WIX)bin\heat.exe" dir $(SolutionDir)EmailGenerationService\bin\PROD 
        -cg EmailGenFiles -gg -scom -sreg -sfrag -srd -suid 
        -dr INSTALLLOCATION -var var.FileSource 
        -t $(Projectdir)KeyPathTransform.xslt 
        -out $(ProjectDir)DirectoryAndFileComponents.wxs 

Es mi intención de actualizar todos los elementos de archivo con ruta de acceso clave =”no” en mi archivo DirectoryAndFileComponents.wxs. Una muestra de la salida de calor es:

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
    <DirectoryRef Id="INSTALLLOCATION"> 
     <Component Id="Dollar.Common.dll" Guid="{2BCD0767-2383-47CF-B1BF-325FA4A3264F}"> 
     <File Id="Dollar.Common.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.dll" /> 
     </Component> 
     <Component Id="Dollar.Common.Exceptions.dll" Guid="{B7238091-76D1-42F5-A3B4-A539DFF3BD92}"> 
     <File Id="Dollar.Common.Exceptions.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Exceptions.dll" /> 
     </Component> 
     <Component Id="Dollar.Common.Exceptions.pdb" Guid="{43711979-747D-49C9-BAE4-ECD44FAF5E67}"> 
     <File Id="Dollar.Common.Exceptions.pdb" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Exceptions.pdb" /> 
     </Component> 
     <Component Id="Dollar.Common.Logging.dll" Guid="{59F9ABF3-5F68-410C-BC96-0556282F1E04}"> 
     <File Id="Dollar.Common.Logging.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Logging.dll" /> 
     </Component> 

Aquí es el XSLT estoy pasando a calor para realizar la transformación:

<?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" 
      exclude-result-prefixes="msxsl" 
      xmlns:wix="http://schemas.microsoft.com/wix/2006/wix" 
      xmlns:my="my:my"> 

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

    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match='/wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Component/wix:File[@Id and not (@Id="EmailGenerationService.exe")]'> 
    <xsl:attribute name="KeyPath"> 
      <xsl:value-of select="no"/> 
    </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

he tratado bastantes variaciones de esta basado en otra publicaciones en este sitio y en otro lugar, pero hasta el momento no han podido obtener el archivo creado por heat.exe para tener KeyPath = "no".

¿Me falta algo obvio?

Respuesta

11

tienes diferentes espacios de nombres definidos:

  1. En XML: _ http://schemas.microsoft.com/wix/2006/wi
  2. En XSLT: http://schemas.microsoft.com/wix/2006/wix

Como sé, espacio de nombres correcto para WiX es http://schemas.microsoft.com/wix/2006/wi. Por lo tanto, debe corregir su XSLT.

XSLT:

<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
      exclude-result-prefixes="msxsl" 
      xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" 
      xmlns:my="my:my"> 

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

    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match='wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Component/wix:File[@Id and not (@Id = "EmailGenerationService.exe")]'> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:attribute name="KeyPath"> 
       <xsl:text>no</xsl:text> 
      </xsl:attribute> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

de entrada XML: XML

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
     <DirectoryRef Id="INSTALLLOCATION"> 
      <Component Id="Dollar.Common.dll" Guid="{2BCD0767-2383-47CF-B1BF-325FA4A3264F}"> 
       <File Id="Dollar.Common.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.dll" /> 
      </Component> 
      <Component Id="Dollar.Common.Exceptions.dll" Guid="{B7238091-76D1-42F5-A3B4-A539DFF3BD92}"> 
       <File Id="Dollar.Common.Exceptions.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Exceptions.dll" /> 
      </Component> 
      <Component Id="Dollar.Common.Exceptions.pdb" Guid="{43711979-747D-49C9-BAE4-ECD44FAF5E67}"> 
       <File Id="Dollar.Common.Exceptions.pdb" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Exceptions.pdb" /> 
      </Component> 
      <Component Id="Dollar.Common.Logging.dll" Guid="{59F9ABF3-5F68-410C-BC96-0556282F1E04}"> 
       <File Id="Dollar.Common.Logging.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Logging.dll" /> 
      </Component> 
     </DirectoryRef> 
    </Fragment> 
</Wix> 

Salida:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
    <DirectoryRef Id="INSTALLLOCATION"> 
     <Component Id="Dollar.Common.dll" Guid="{2BCD0767-2383-47CF-B1BF-325FA4A3264F}"> 
     <File Id="Dollar.Common.dll" Source="$(var.FileSource)\Dollar.Common.dll" KeyPath="no" /> 
     </Component> 
     <Component Id="Dollar.Common.Exceptions.dll" Guid="{B7238091-76D1-42F5-A3B4-A539DFF3BD92}"> 
     <File Id="Dollar.Common.Exceptions.dll" Source="$(var.FileSource)\Dollar.Common.Exceptions.dll" KeyPath="no" /> 
     </Component> 
     <Component Id="Dollar.Common.Exceptions.pdb" Guid="{43711979-747D-49C9-BAE4-ECD44FAF5E67}"> 
     <File Id="Dollar.Common.Exceptions.pdb" Source="$(var.FileSource)\Dollar.Common.Exceptions.pdb" KeyPath="no" /> 
     </Component> 
     <Component Id="Dollar.Common.Logging.dll" Guid="{59F9ABF3-5F68-410C-BC96-0556282F1E04}"> 
     <File Id="Dollar.Common.Logging.dll" Source="$(var.FileSource)\Dollar.Common.Logging.dll" KeyPath="no" /> 
     </Component> 
    </DirectoryRef> 
    </Fragment> 
</Wix> 
+0

Gracias por la respuesta, pero esto tampoco funciona. El calor funciona bien sin errores, pero el archivo resultante todavía tiene KeyPath = "yes" en todos los nodos. –

+0

@MarkJones, he actualizado mi respuesta. –

+1

perfecto, muchas gracias –

2

No voy a responder a su pregunta original. :)

He leído que FIJOS D para establecer el keyPath a “no” para todos mis archivos, con la excepción del .exe

Creo que eras inducir a error. En realidad, el ServiceInstall table tiene una columna Component_, y de acuerdo con MSDN:

para instalar este servicio mediante la tabla InstallService, la KeyPath para este componente debe ser el archivo ejecutable para el servicio.

No significa que los archivos no exe en otros componentes deben tener @KeyPath='no'. Simplemente dice que el archivo EXE del servicio debe residir en un componente separado y debe ser la ruta clave del mismo.

La ruta clave es un concepto muy importante de la tecnología MSI. Puede leer más al respecto here, see the description of the KeyPath column.

Ahora, si volvemos a su pregunta original, no, no tiene que ajustar la salida de calor de la manera que ha mencionado. Generará la creación de WiX que necesita de forma predeterminada.

+0

Gracias por la información de Yan, tomé mis suposiciones desde aquí: http://blog.tentaclesoftware.com/archive/2009/01/01/21.aspx –

+0

En la muestra que hace referencia a un solo componente contiene una serie de archivos. Es cierto que solo un archivo se puede marcar como KeyPath = 'yes', pero no es necesario marcar explícitamente a otros como KeyPath = 'no'. Y en la muestra heat.exe generada para usted, su suposición es puramente incorrecta. –

+0

@Mark Jones, lo siento si mi comentario anterior parece expresarse en una forma difícil. Simplemente no puedo resistirme a reaccionar cuando veo que la gente dedica tiempo y esfuerzos para resolver un problema que no existe :) –

1

¿Puedo sugerir un enfoque diferente?

<xsl:template match="@KeyPath[parent::wix:File[parent::wix:Component[parent::wix:DirectoryRef[parent::wix:Fragment[parent::wix:Wix]]]] and . != 'EmailGenerationService.exe']"> 
     <xsl:attribute name="KeyPath"> 
      <xsl:value-of select="'no'"/> 
     </xsl:attribute> 
</xsl:template> 

Simplemente cambie su plantilla haciendo coincidir lo anterior y debería tener el resultado correcto.

Cuestiones relacionadas