web-dev-qa-db-fra.com

Comment puis-je définir la version de l'installateur WiX sur la version de build actuelle?

J'ai écrit une application et son installateur WiX et je l'ai placée sous contrôle de version en utilisant Subversion. Lorsque le programme d'installation WiX crée, je veux que son numéro de version soit la version actuelle de l'application. Comment est-ce que j'accomplis ceci? J'ai utilisé c # pour coder l'application.

N.B. J'utilise ccnet pour construire ce projet

123
Draco

Vous pouvez utiliser Product/@ Version = "! (Bind.FileVersion.FileId)" (remplacer FileId par le Id du fichier dont vous souhaitez obtenir le numéro de version) et light.exe remplira la valeur avec la version du fichier référencé par FileId.

165
Rob Mensching

J'ai fait cela dans l'un de mes projets en écrivant une extension de préprocesseur pour lire la version du fichier depuis mon exécutable. Le fichier WiX ressemble donc à quelque chose comme:

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

J'ai posté le code pour sur CodePlex: http://wixfileversionext.codeplex.com/

36
Chris Kaczor

Si quelqu'un cherche un exemple XML réel, cela fonctionne avec les assemblys .NET (et vous n'avez pas besoin de faire les attributs Assembly ou KeyPath). J'ai éliminé le code sans rapport avec les [...] espaces réservés:

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

Voici un moyen très simple d'obtenir la version de votre ensemble d'amorçage pour qu'elle corresponde à votre version d'assemblage MyApp à l'aide d'un BeforeBuild Target et 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>
18
Brock Hensley

Cela semble assez proche de ce que vous essayez d'accomplir. Voyez ce que l'équivalent est dans le régulateur de vitesse.

http://www.ageektrapped.com/blog/setting-properties-for-wix-in-msbuild/

3
JohnW

Vous pouvez transmettre la version au script MSBuild pour votre projet d'installation de la même manière que vous pouvez passer pour le script de génération de l'application.

Par exemple, si votre système CI définit les variables AppVersion et BuildNumber et les transmet à vos scripts MSBuild, votre wixproj peut créer une propriété Version correspondante qu'il transmet à Wix comme cette:

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

La première définition de Version fournit une valeur par défaut lorsque vous créez localement. Tout ce qu'il finit par devenir une variable Version dans Wix. Utilisez-le dans un fichier wsx comme celui-ci:

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

J'aime inclure la version dans la description afin qu'il soit facile de rechercher à partir de l'Explorateur de fenêtres (en tant que colonne dans la vue détaillée ou sur la page Propriétés) indépendamment du nom de fichier.

Passer la version en tant que variable vous donne plus de contrôle que la lire dans un fichier. Lorsque vous lisez à partir d'un fichier, vous obtenez les 4 parties de la version programmatique. Cependant, ProductVersion est uniquement conçu pour utiliser les 3 premières parties.

2
Edward Brey