2009-03-09 3 views
105

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

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

ответ

138

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

+2

Только то, что я искал! Хотя мне пришлось использовать «! (Bind.FileVersion.FileId)» («!» Вместо «$»), в противном случае я получил ошибку директивы препроцессора. –

+8

Да, извините, постоянная умственная ошибка, которую я делаю. $ - препроцессорная переменная и! является переменной связующего. –

+0

Это не могло быть никаким slicker. Благодаря! – briantyler

28

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

+2

+1 для этого ... Я использую его при каждой установке. – harlam357

+0

@ Chris Kaczor WiX noob здесь. Некоторые инструкции по установке будут удобны ... – Trent

+0

Поддерживает ли ваше расширение? Я попытался добавить его в качестве ссылки, и у меня появилась ошибка. –

16

Вот очень простой способ, чтобы получить Bootstrapper 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> 
+2

ошибка LGHT0298: неопределенная переменная привязки-времени –

+0

@AliKazmi Вы определили свои 'var.ProductName' и' var.BuildVersion' где-то выше вашего ''? –

+2

Я пробовал это и не могу рекомендовать это достаточно - объедините его с патчером сборки для TeamCity, и у вас есть выигрышная формула. Вместо этого я не использовал элемент Bundle, а элемент продукта и работал для меня. – IbrarMumtaz

13

В случае, если кто-то ищет реального примера 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> 
+0

Это гораздо лучший ответ. Спасибо за рабочий пример. – rolls

+0

где он извлекает фактический номер версии? – foobar

+0

@foobar Это было некоторое время с тех пор, как я был здесь, но если вы посмотрите на строку '! (Bind.fileVersion.MyDLL)', она использует 3-ю часть в ссылке на ' K0D4

Смежные вопросы