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