2009-03-09 11 views
105

Ho scritto un'applicazione e il suo programma di installazione WiX e l'ho messa sotto controllo versione usando subversion. Quando il programma di installazione di WiX viene compilato, voglio che il suo numero di versione sia la versione di build corrente dell'applicazione. Come posso realizzare questo? Ho usato C# per codificare l'applicazione.Come posso impostare la versione del programma di installazione WiX sulla versione di build corrente?

N.B. Sto usando ccnet per costruire questo progetto

risposta

138

Si potrebbe utilizzare prodotto/@ Version = "! (Bind.FileVersion.FileId)" (sostituire FileId con la Id del file da cui si desidera ottenere il numero di versione) e la luce .exe popolerà il valore con la versione del file a cui fa riferimento lo FileId.

+2

Proprio quello che stavo cercando! Anche se ho dovuto usare "! (Bind.FileVersion.FileId)" (un "!" Invece di "$"), altrimenti ho ricevuto un errore di direttiva del preprocessore. –

+8

Sì, mi dispiace, errore mentale costante che faccio. $ è la variabile del preprocessore e! è una variabile di binder. –

+0

Questo potrebbe non essere un cereale. Grazie! – briantyler

28

Ho fatto questo in uno dei miei progetti scrivendo un'estensione per il preprocessore per leggere la versione del file dal mio eseguibile. Quindi il file WiX sembra qualcosa di simile:

<?define ProductName="$(fileVersion.ProductName($(var.MyApp.TargetPath)))" ?> 
<?define CompanyName="$(fileVersion.CompanyName($(var.MyApp.TargetPath)))" ?> 
<?define ProductVersion="$(fileVersion.ProductVersion($(var.MyApp.TargetPath)))" ?> 
<Product 
    Id="<product ID>" 
    Name="$(var.ProductName)" 
    Version="$(var.ProductVersion)" 
    Manufacturer="$(var.CompanyName)" 
    Language="1033" 
    UpgradeCode="<upgrade code>"> 

ho postato il codice per in su CodePlex: http://wixfileversionext.codeplex.com/

+2

+1 per questo ... lo uso in ogni installazione. – harlam357

+0

@Chris Kaczor WiX noob qui. Alcune istruzioni di installazione potrebbero essere utili ... – Trent

+0

La tua estensione funziona ancora? Ho provato ad aggiungerlo come riferimento e ho ricevuto un errore. –

16

Ecco un modo molto semplice per ottenere il vostro programma di avvio automatico Bundle versione per abbinare il vostro MyApp AssemblyVersion utilizzando un BeforeBuild Target e DefineConstants.

Bundle.wxs:

<Bundle Name="$(var.ProductName) Bootstrapper v$(var.BuildVersion)" 
    Version="$(var.BuildVersion)" 

Bootstrapper.wixproj:

<Target Name="BeforeBuild"> 
    <GetAssemblyIdentity AssemblyFiles="..\MyApp\bin\$(Configuration)\MyApp.exe"> 
    <Output TaskParameter="Assemblies" ItemName="AssemblyVersion" /> 
    </GetAssemblyIdentity> 
    <PropertyGroup> 
    <DefineConstants>BuildVersion=%(AssemblyVersion.Version)</DefineConstants> 
    </PropertyGroup> 
</Target> 
+2

errore LGHT0298: Variabile tempo di associazione non risolto –

+0

@AliKazmi Hai definito il tuo 'var.ProductName' e' var.BuildVersion' da qualche parte sopra il tuo ''? –

+2

Ho provato questo e non posso raccomandarlo abbastanza: combinalo con l'assembly patcher per TeamCity e hai una formula vincente. Non ho usato l'elemento Bundle ma un elemento prodotto e ho comunque funzionato per me. – IbrarMumtaz

13

Nel caso in cui qualcuno è alla ricerca di un esempio XML vero e proprio, questo funziona con assembly .NET (e non avere per eseguire gli attributi Assembly o KeyPath). Ho eliminato il codice non collegato con i [...] segnaposto:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Product [...] Version="!(bind.fileVersion.MyDLL)"> 
     [...] 
     <Directory Id="TARGETDIR" Name="SourceDir"> 
      <Directory Id="ProgramFilesFolder" Name="PFiles"> 
       <Directory Id="INSTALLDIR" Name="MyDLLInstallLocation"> 
        <Component Id="MainLib" Guid="[...]"> 
         <File Id="MyDLL" Name="MyDll.dll" Source="MyDll.dll" /> 
         [...] 
        </Component> 
        [...] 
       </Directory> 
      </Directory> 
     </Directory> 
    </Product> 
</Wix> 
+0

Questa è una risposta molto migliore. Grazie per l'esempio di lavoro. – rolls

+0

dove sta recuperando il numero di versione attuale? – foobar

+0

@foobar È passato un po 'di tempo da quando ero qui, ma se si guarda la stringa '! (Bind.fileVersion.MyDLL)' usa la terza parte in riferimento a ' K0D4

Problemi correlati