Come posso impostare la versione del programma di installazione WiX sulla versione di build corrente?


134

Ho scritto un'applicazione e il suo programma di installazione WiX e l'ho messo sotto controllo della versione usando Subversion. Quando il programma di installazione di WiX crea, voglio che il suo numero di versione sia la versione di build corrente dell'applicazione. Come posso farlo? Ho usato c # per codificare l'applicazione.

NB Sto usando ccnet per costruire questo progetto

Risposte:


181

È possibile utilizzare Product/@Version="!(bind.FileVersion.FileId)"(sostituire FileIdcon il Idfile da cui si desidera ottenere il numero di versione) e light.exe popolerà il valore con la versione del file a cui fa riferimento il FileId.


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

8
Sì, scusa, continuo errore mentale che faccio. $ è la variabile del preprocessore e! è variabile legante.
Rob Mensching,

20
Nota che "Fileid" dovrebbe essere il valore di un elemento <ID file = "Fileid" ...> e apparentemente può includere il carattere punto (.).
James Hugard

6
È possibile farlo anche per un bundle / bootstrapper?
Noelico

6
Un collegamento alla relativa documentazione, sezione: Variabili
leganti

39

L'ho fatto in uno dei miei progetti scrivendo un'estensione del preprocessore per leggere la versione del file dal mio eseguibile. Quindi il file WiX è simile al seguente:

<?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 pubblicato il codice per in su CodePlex: http://wixfileversionext.codeplex.com/


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

Questa estensione ha funzionato alla grande con Wix 3.5, dopo l'aggiornamento a Wix 3.9 genera una NullPointerException. Ovviamente qualcosa si è rotto tra queste versioni.
Gigo,

2
@Gigo L'ho fatto funzionare tramite <?define ProductName="!(bind.property.ProductName)" ?><?define CompanyName="!(bind.property.Manufacturer)" ?><?define ProductVersion=!(bind.FileVersion.FileId) ?> Dov'è FileIdil valore Iddell'attributo di uno dei tuoi Fileelementi all'interno di a Component.
Jared,

Il link CodePlex non si apre per me. Esiste un altro modo se non quello di scrivere la propria estensione pre-processore?
RDV

28

Nel caso in cui qualcuno stia cercando un vero esempio XML, questo funziona con gli assembly .NET (e non è necessario eseguire gli attributi Assembly o KeyPath). Ho eliminato il codice non correlato con i [...] segnaposti:

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

1
Questa è una risposta molto migliore. Grazie per l'esempio funzionante.
lancia il

dove sta recuperando il numero di versione attuale?
foobar,

@foobar È passato un po 'di tempo da quando ero qui, ma se guardi la stringa !(bind.fileVersion.MyDLL)usa la terza parte in riferimento alla <File Id="MyDLL"...sezione
K0D4

Questo ha funzionato bene per me. Funziona con file eseguibili compilati e DLL, il che è ottimo per bloccare la versione del programma di installazione e il contenuto dell'interfaccia utente alle informazioni sull'assieme exe, senza dover cambiare le cose in più punti
rcbevans,

21

Ecco un modo molto semplice per ottenere la versione del bundle Bootstrapper in modo che corrisponda alla versione di MyApp AssemblyVersion utilizzando un BeforeBuild Targete 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>

@AliKazmi Hai definito il tuo var.ProductNamee var.BuildVersionda qualche parte sopra il tuo <Bundle>?
Brock Hensley,

2
Ho provato questo e non posso raccomandarlo abbastanza: combinalo con il patcher di assemblaggio per TeamCity e avrai una formula vincente. Non ho usato l'elemento Bundle ma un elemento prodotto e ho comunque lavorato per me.
IbrarMumtaz,

VS adora ignorare il BeforeBuildbersaglio, quindi potrebbe essere necessario specificare esplicitamente AfterTargets="AfterResolveReferences"se stai costruendo nell'IDE
Dmitry

Ho aggiunto il codice Bootstrapper.wixproj nel mio * .wixproj e nel file Product.wxs, ho definito la variabile buildversion come:
RDV

4

È possibile passare la versione allo script MSBuild per il proprio progetto di installazione così come si può passare per lo script di build dell'applicazione.

Ad esempio, se il tuo sistema CI definisce le variabili AppVersione le BuildNumberpassa agli script MSBuild, il tuo wixproj può creare una Versionproprietà corrispondente che inoltra a Wix in questo modo:

<PropertyGroup>
    <Version Condition=" '$(BuildNumber)' == '' ">0.0.1</Version>
    <Version Condition=" '$(BuildNumber)' != '' ">$(AppVersion).$(BuildNumber)</Version>
    <DefineConstants>Version=$(Version)</DefineConstants>
</PropertyGroup>

La prima definizione di Versionfornisce un valore predefinito per quando si crea localmente. Tutto ciò che finisce diventa una Versionvariabile in Wix. Usalo in un file wsx come questo:

<Product Version="$(var.Version)" ...>
    <Package Description="$(var.ProductName) $(var.Version): $(var.ProductDescription)" ... />

Mi piace includere la versione nella descrizione in modo che sia facile consultare Windows Explorer (come una colonna nella vista Dettagli o nella pagina Proprietà) indipendentemente dal nome del file.

Passare la versione come variabile ti dà più controllo della lettura da un file. Quando leggi da un file, ottieni tutte e 4 le parti della versione programmatica. Tuttavia, ProductVersion è progettato esclusivamente per utilizzare le prime 3 parti.


Grazie, questo mi ha salvato la giornata. A proposito: il codice superiore snipped va nel tuo progetto (* .wxiproj). Dover gestire un CI-Build Devops / VSTS questa è la risposta migliore. Dal momento che ho già pronto la mia variabile della versione finale. Nel mio caso <Version Condition=" '$(BuildVersionOfAsm)' != '' ">$(BuildVersionOfAsm)</Version>è diventato : mentre BuildVersionOfAsm è una variabile nelle pipeline di devops.
Robetto,

Voglio scegliere la versione in modo dinamico, questo metodo mi richiederà di continuare ad aggiornare la versione in * .wixproj. C'è un modo per qualsiasi versione di DLL in questo campo?
RDV,

@RDV L'intento di questo approccio non è quello di modificare alcun file nel controllo del codice sorgente, incluso il file .wixproj. Il numero di versione dinamico è fornito dal tuo sistema CI (AppVersion e BuildNumber in questo esempio). In genere, si impostano i numeri di versione maggiore e minore come variabili CI e si consente al sistema CI di generare dinamicamente il numero di build.
Edward Brey,

Eccellente: proprio il tipo di soluzione di cui avevo bisogno, incluso un valore predefinito per build locali.
ColH

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.