Как установить версию установщика WiX на текущую версию сборки? - PullRequest
117 голосов
/ 09 марта 2009

Я написал приложение и его установщик WiX и поставил его под контроль версий с помощью Subversion. Когда сборщик установщика WiX собирается, я хочу, чтобы его номер версии был текущей версией сборки приложения. Как мне это сделать? Я использовал c # для кодирования приложения.

N.B. Я использую ccnet для создания этого проекта

Ответы [ 6 ]

160 голосов
/ 13 марта 2009

Вы можете использовать Product / @ Version = "! (Bind.FileVersion.FileId)" (заменить FileId на Id файла, из которого вы хотите получить номер версии) и light.exe заполнит значение версией файла, на который ссылается FileId.

35 голосов
/ 14 марта 2009

Я сделал это в одном из моих проектов, написав расширение препроцессора для чтения версии файла из моего исполняемого файла. Таким образом, файл 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>">

Я разместил код для в CodePlex: http://wixfileversionext.codeplex.com/

23 голосов
/ 29 июля 2015

В случае, если кто-то ищет настоящий пример XML, это работает со сборками .NET (и вам не нужно выполнять атрибуты 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>
18 голосов
/ 26 сентября 2013

Вот очень простой способ получить версию Butstrapper Bundle, соответствующую версии MyApp AssemblyVersion, используя BeforeBuild Target и 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>
3 голосов
/ 09 марта 2009

Это выглядит достаточно близко к тому, что вы пытаетесь достичь. Посмотрите, что эквивалентен в круиз-контроле.

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

0 голосов
/ 26 марта 2019

Вы можете передать версию в скрипт 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)" ... />

Мне нравится включать версию в описание, чтобы ее можно было легко найти в проводнике (в виде столбца в подробном представлении или на странице свойств) независимо от имени файла.

Передача версии в качестве переменной дает вам больше контроля, чем чтение ее из файла. Когда вы читаете из файла, вы получаете все 4 части программной версии. Однако ProductVersion предназначен только для использования первых трех частей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...