2009-03-09 6 views
105

Ich habe eine Anwendung und ihren WiX-Installer geschrieben und unter Versionskontrolle mit Subversion gesetzt. Wenn das WiX-Installationsprogramm erstellt, möchte ich, dass seine Versionsnummer die aktuelle Build-Version der Anwendung ist. Wie erreiche ich das? Ich benutzte C#, um die Anwendung zu kodieren.Wie kann ich die WiX-Installer-Version auf die aktuelle Build-Version einstellen?

N.B. Ich benutze ccnet, um dieses Projekt zu bauen

Antwort

138

Sie könnten Produkt/@ Version verwenden = "! (Bind.FileVersion.FileId)" (ersetzen FileId mit den Id der Datei, aus der Sie mögen die Versionsnummer erhalten) und Licht .exe füllt den Wert mit der Version der Datei, die von FileId referenziert wird.

+2

Genau das, was ich gesucht habe! Obwohl ich "! (Bind.FileVersion.FileId)" verwenden musste (ein "!" Anstelle von "$"), sonst bekam ich einen Präprozessor-Direktivitätsfehler. –

+8

Ja, sorry, konstanter mentaler Fehler, den ich mache. $ ist Präprozessorvariable und! ist Bindevariable. –

+0

Das könnte nicht einfacher sein. Vielen Dank! – briantyler

28

Ich tat dies in einem meiner Projekte, indem ich eine Präprozessor-Erweiterung schrieb, um die Dateiversion von meiner ausführbaren Datei zu lesen. So sieht die WiX-Datei so etwas wie:

<?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 den Code geschrieben habe in auf CodePlex: http://wixfileversionext.codeplex.com/

+2

+1 für dieses ... Ich benutze es bei jeder Installation. – harlam357

+0

@Chris Kaczor WiX noob hier. Einige Installationsanweisungen wären praktisch ... – Trent

+0

Funktioniert Ihre Erweiterung noch? Ich habe versucht, es als Referenz hinzuzufügen, und ich habe einen Fehler erhalten. –

16

Hier ist eine sehr einfache Möglichkeit, Ihre Bootstrapper Bundle Version zu bekommen, um Ihre MeineAnw Assembly ein BeforeBuild Target mit Übereinstimmen und 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

Fehler LGHT0298: Nicht aufgelöste Bindezeitvariable –

+0

@AliKazmi Haben Sie 'var.ProductName' und' var.BuildVersion' irgendwo oberhalb Ihrer '' definiert? –

+2

Ich habe das ausprobiert und kann das nicht genug empfehlen - kombiniere es mit dem Assembly Patcher für TeamCity und du hast eine Gewinnformel. Ich habe das Bundle-Element nicht benutzt, sondern ein Produktelement und habe trotzdem für mich gearbeitet. – IbrarMumtaz

13

Falls jemand für ein tatsächliches XML-Beispiel sucht, funktioniert dies mit .NET-Assemblies (und Sie haben nicht die Attribute Assembly oder KeyPath auszuführen). Ich beseitige nicht verwandten Code mit [...] Platzhaltern:

<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

Dies ist eine viel bessere Antwort. Danke für das Arbeitsbeispiel. – rolls

+0

Wo wird die aktuelle Versionsnummer abgerufen? – foobar

+0

@foobar Es ist eine Weile her, seit ich hier war, aber wenn man sich den String '! (Bind.fileVersion.MyDLL) anschaut' 'benutzt er den dritten Teil in Bezug auf die' K0D4