2011-11-07 1 views
10

Sto provando a creare un programma di installazione WiX per un servizio Windows, e ho letto che ho deciso di impostare keyPath su "no" per tutti i miei file, con il eccezione del .exe nel mio script WiX. Attualmente sto generando il mio Directory e file di struttura utilizzando Heat.exe qui è il mio comando:Programma di installazione WiX: utilizzo di xslt con heat.exe per aggiornare gli attributi

"$(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 

E 'mia intenzione aggiornare tutti gli elementi del file con percorso chiave =”no” nel mio file DirectoryAndFileComponents.wxs. Un campione dell'output del calore è:

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

Ecco XSLT sto passando per riscaldare per eseguire la trasformazione:

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

Ho provato parecchi variazioni di questa basate su altre post su questo sito e altrove dove, ma ancora non è stato possibile ottenere il file creato da heat.exe per avere KeyPath = "no".

Mi manca qualcosa di ovvio?

risposta

11

avete diverse spazi dei nomi definiti:

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

Per quanto ne so, corretto spazio dei nomi per Wix è http://schemas.microsoft.com/wix/2006/wi. Quindi dovresti correggere il tuo XSLT.

XSLT: XML

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

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

uscita:

<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

Grazie per la risposta, ma anche questo non funziona. Il calore funziona bene senza errori, ma il file risultante ha ancora KeyPath = "sì" su tutti i nodi. –

+0

@MarkJones, ho aggiornato la mia risposta. –

+1

perfetto, grazie mille –

2

Non voglio rispondere alla tua domanda iniziale. :)

Ho letto che ho alettato per impostare il percorso chiave per “no” per tutti i miei file, con l'eccezione del exe

penso che eri trarre in inganno. In realtà il ServiceInstall table ha una colonna Component_, e secondo MSDN:

per installare questo servizio utilizzando la tabella installservice, il KeyPath per questo componente deve essere il file eseguibile per il servizio.

Ciò non significa che i file non exe in altri componenti debbano avere @KeyPath='no'. Dice solo che il file EXE del servizio deve risiedere in un componente separato e deve essere il percorso chiave di esso.

Il percorso chiave è un concetto molto importante della tecnologia MSI. Potete leggere di più su di esso here, see the description of the KeyPath column.

Ora, se torniamo alla domanda iniziale, no, non è necessario regolare la potenza del riscaldamento come hai menzionato. Genererà l'authoring WiX necessario per impostazione predefinita.

+0

Grazie per le informazioni Yan, ho preso le mie offerte da qui: http://blog.tentaclesoftware.com/archive/2009/01/01/21.aspx –

+0

Nell'esempio di riferimento un singolo componente contiene un numero di file. È vero che solo un file può essere contrassegnato come KeyPath = 'yes', ma non devi contrassegnare esplicitamente gli altri come KeyPath = 'no'. E nel campione heat.exe generato per te la tua ipotesi è completamente sbagliata. –

+0

@Mark Jones, scusa se il mio commento precedente sembra espresso in una forma difficile. Semplicemente non riesco a resistere alla reazione quando vedo le persone passare il tempo e gli sforzi cercando di risolvere un problema che non esiste :) –

1

Posso suggerire un approccio diverso?

Basta cambiare il modello che corrisponde a quanto sopra e si dovrebbe avere il risultato corretto.