Как я могу установить версию установщика WiX на текущую версию сборки?
Вопрос
Я написал приложение и его установщик WiX и поместил его под контроль версий с помощью subversion.Когда установщик WiX будет собран, я хочу, чтобы его номером версии была текущая версия сборки приложения.Как мне этого добиться?Я использовал c # для кодирования приложения.
Н.Б.Я использую ccnet для создания этого проекта
Решение
Вы могли бы использовать Product/@Version="!(привязка.FileVersion.FileId)" (заменить FileId
с помощью Id
файла, из которого вы хотели бы получить номер версии) и light.exe заполнит значение версией файла, на который ссылается FileId
.
Другие советы
Я сделал это в одном из своих проектов, написав расширение препроцессора для чтения версии файла из моего исполняемого файла.Итак, файл WiX выглядит примерно так:
<?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>">
Я разместил код для in на CodePlex: http://wixfileversionext.codeplex.com/
На случай, если кто-то ищет реальный пример XML, это работает с .СЕТЕВЫЕ сборки (и вам не нужно указывать атрибуты Assembly или keyPath).Я устранил несвязанный код с [...] заполнителями:
<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>
Вот очень простой способ привести версию вашего пакета Bootstrapper в соответствие с вашей версией MyApp Assembly с помощью BeforeBuild Target
и DefineConstants
.
Комплект.wxs:
<Bundle Name="$(var.ProductName) Bootstrapper v$(var.BuildVersion)"
Version="$(var.BuildVersion)"
Загрузчик.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>
Это выглядит достаточно близко к тому, чего вы пытаетесь достичь.Посмотрите, что такое эквивалент в круиз-контроле.
http://www.ageektrapped.com/blog/setting-properties-for-wix-in-msbuild/
Вы можете передать версию скрипту MSBuild для вашего проекта установки так же, как вы можете передать версию для сценария сборки приложения.
Например, если ваша система CI определяет переменные AppVersion
и BuildNumber
, и передает их вашим сценариям MSBuild, ваш wixproj может создать соответствующий Version
свойство, которое он пересылает в Wix следующим образом:
<PropertyGroup>
<Version Condition=" '$(BuildNumber)' == '' ">0.0.1</Version>
<Version Condition=" '$(BuildNumber)' != '' ">$(AppVersion).$(BuildNumber)</Version>
<DefineConstants>Version=$(Version)</DefineConstants>
</PropertyGroup>
Первое определение Version
предоставляет значение по умолчанию для случаев, когда вы строите локально.Чем бы это ни закончилось, становится Version
переменная в Wix.Используйте его в файле wsx, подобном этому:
<Product Version="$(var.Version)" ...>
<Package Description="$(var.ProductName) $(var.Version): $(var.ProductDescription)" ... />
Мне нравится включать версию в описание, чтобы ее было легко найти в Проводнике Windows (в виде столбца в подробном представлении или на странице свойств) независимо от имени файла.
Передача версии в виде переменной дает вам больше контроля, чем чтение ее из файла.Когда вы читаете из файла, вы получаете все 4 части программной версии.Однако, Версия продукта предназначен только для использования первых 3 частей.