Wie kann ich die WiX-Installationsversion auf die aktuelle Build-Version einstellen?

134

Ich habe eine Anwendung und deren WiX-Installationsprogramm geschrieben und sie mithilfe von Subversion unter Versionskontrolle gestellt. Wenn das WiX-Installationsprogramm erstellt wird, soll die Versionsnummer die aktuelle Build-Version der Anwendung sein. Wie schaffe ich das? Ich habe c # verwendet, um die Anwendung zu codieren.

NB Ich verwende ccnet, um dieses Projekt zu erstellen

Draco
quelle

Antworten:

181

Sie könnten verwenden Product/@Version="!(bind.FileVersion.FileId)"(ersetzen FileIdmit dem Idvon der Datei , von dem Sie mögen die Versionsnummer erhalten) und light.exe den Wert mit der Version der Datei durch die referenzierte bevölkern FileId.

Rob Mensching
quelle
4
Genau das, wonach ich gesucht habe! Obwohl ich "! (Bind.FileVersion.FileId)" (ein "!" Anstelle von "$") verwenden musste, bekam ich ansonsten einen Präprozessor-Direktivenfehler.
Nicholas Piasecki
8
Ja, tut mir leid, ich mache ständig einen mentalen Fehler. $ ist Präprozessorvariable und! ist Bindemittelvariable.
Rob Mensching
20
Beachten Sie, dass "Fileid" der Wert eines <File Id = "Fileid" ...> -Elements sein sollte und anscheinend das Punktzeichen (.) Enthalten kann.
James Hugard
6
Ist dies auch für ein Bundle / Bootstrapper möglich?
Noelicus
6
Ein Link zur zugehörigen Dokumentation, Abschnitt: Binder-Variablen
mcdon
39

Ich habe dies in einem meiner Projekte getan, indem ich eine Präprozessor-Erweiterung geschrieben habe, um die Dateiversion aus meiner ausführbaren Datei zu lesen. Die WiX-Datei sieht also ungefähr so ​​aus:

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

Ich habe den Code für in auf CodePlex gepostet: http://wixfileversionext.codeplex.com/

Chris Kaczor
quelle
Funktioniert Ihre Erweiterung noch? Ich habe versucht, es als Referenz hinzuzufügen, und es ist ein Fehler aufgetreten.
Stefan Vasiljevic
Diese Erweiterung hat mit Wix 3.5 hervorragend funktioniert. Nach dem Update auf Wix 3.9 wird eine NullPointerException ausgelöst. Offensichtlich ist zwischen diesen Versionen etwas eingebrochen.
Gigo
2
@Gigo Ich habe es funktioniert über <?define ProductName="!(bind.property.ProductName)" ?><?define CompanyName="!(bind.property.Manufacturer)" ?><?define ProductVersion=!(bind.FileVersion.FileId) ?> Wo FileIdist der Wert des IdAttributs eines Ihrer FileElemente in einem Component.
Jared
Der CodePlex-Link wird für mich nicht geöffnet. Gibt es eine andere Möglichkeit, als Ihre eigene Pre-Prozessor-Erweiterung zu schreiben?
RDV
28

Wenn jemand nach einem tatsächlichen XML-Beispiel sucht, funktioniert dies mit .NET-Assemblys (und Sie müssen die Assembly- oder KeyPath-Attribute nicht ausführen). Ich habe nicht verwandten Code mit [...] Platzhaltern entfernt:

<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>
K0D4
quelle
1
Dies ist eine viel bessere Antwort. Vielen Dank für das Arbeitsbeispiel.
rollt
Wo wird die tatsächliche Versionsnummer abgerufen?
Foobar
@foobar Es ist schon eine Weile her, seit ich hier war, aber wenn Sie sich die Zeichenfolge ansehen !(bind.fileVersion.MyDLL), verwendet sie den 3. Teil in Bezug auf den <File Id="MyDLL"...Abschnitt
K0D4
Das hat bei mir gut funktioniert. Funktioniert sowohl für kompilierte ausführbare Dateien als auch für
DLLs.
21

Hier ist eine sehr einfache Möglichkeit, Ihre Bootstrapper-Bundle-Version mit einem BeforeBuild Targetund an Ihre MyApp AssemblyVersion anzupassen 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>
Brock Hensley
quelle
@AliKazmi Hast du dein var.ProductNameund var.BuildVersionirgendwo über deinem definiert <Bundle>?
Brock Hensley
2
Ich habe es versucht und kann es nicht genug empfehlen - kombinieren Sie es mit dem Assembly-Patcher für TeamCity und Sie haben eine Erfolgsformel. Ich habe nicht das Bundle-Element, sondern ein Produktelement verwendet und trotzdem für mich gearbeitet.
IbrarMumtaz
VS liebt es einfach, das BeforeBuildZiel zu ignorieren, daher muss möglicherweise explizit angegeben werden, AfterTargets="AfterResolveReferences"ob Sie die IDE
Dmitry
Ich habe den Code Bootstrapper.wixproj in meine * .wixproj-Datei eingefügt und in der Datei Product.wxs die Buildversion-Variable wie folgt definiert:
RDV
4

Sie können die Version an das MSBuild-Skript für Ihr Setup-Projekt übergeben, genauso wie Sie es für das Build-Skript der Anwendung übergeben können.

Wenn Ihr CI-System beispielsweise Variablen definiert AppVersionund BuildNumberdiese an Ihre MSBuild-Skripte übergibt, kann Ihr wixproj eine entsprechende VersionEigenschaft erstellen, die es wie folgt an Wix weiterleitet:

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

Die erste Definition von Versionbietet eine Standardeinstellung für das lokale Erstellen. Was auch immer es endet, wird Versionin Wix zu einer Variablen. Verwenden Sie es in einer WSX-Datei wie folgt:

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

Ich möchte die Version in die Beschreibung aufnehmen, damit Sie unabhängig vom Dateinamen problemlos im Fenster-Explorer (als Spalte in der Detailansicht oder auf der Seite Eigenschaften) nachschlagen können.

Wenn Sie die Version als Variable übergeben, haben Sie mehr Kontrolle als wenn Sie sie aus einer Datei lesen. Wenn Sie aus einer Datei lesen, erhalten Sie alle 4 Teile der programmatischen Version. Allerdings Product ist nur die ersten drei Teile verwenden entworfen.

Edward Brey
quelle
Danke, das hat mir den Tag gerettet. Übrigens: Der abgeschnittene obere Code geht in Ihr Projekt (* .wxiproj). Dies ist die beste Antwort, wenn Sie einen Devops / VSTS CI-Build verwalten müssen. Da habe ich schon meine endgültige Versionsvariable fertig. In meinem Fall stellte sich <Version Condition=" '$(BuildVersionOfAsm)' != '' ">$(BuildVersionOfAsm)</Version>Folgendes heraus : BuildVersionOfAsm ist eine Variable in Devops-Pipelines.
Robetto
Ich möchte Version dynamisch auswählen. Bei dieser Methode muss ich die Version in * .wixproj weiter aktualisieren. Gibt es einen Weg zu einer DLL-Version in diesem Bereich?
RDV
@RDV Mit diesem Ansatz sollen keine Dateien in der Quellcodeverwaltung geändert werden, einschließlich der .wixproj. Die dynamische Versionsnummer wird von Ihrem CI-System bereitgestellt (in diesem Beispiel AppVersion und BuildNumber). In der Regel legen Sie die Haupt- und Nebenversionsnummern als CI-Variablen fest und lassen das CI-System die Build-Nummer dynamisch generieren.
Edward Brey
Ausgezeichnet - genau die Art von Lösung, die ich brauchte, einschließlich einer Standardeinstellung für lokale Builds.
ColH