Как установить версию установщика WiX в текущую версию сборки?

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

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

Ответ 1

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

Ответ 2

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

Ответ 3

Здесь очень простой способ получить версию Bootstrapper Bundle Version в соответствии с вашей конфигурацией 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>

Ответ 4

Если кто-то ищет фактический пример 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>