Як встановити версію інсталятора WiX на поточну версію збірки?


134

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

NB Я використовую ccnet для створення цього проекту

Відповіді:


181

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


4
Тільки те, що я шукав! Хоча мені довелося використовувати "! (Bind.FileVersion.FileId)" (a "!" Замість "$"), інакше я отримав помилку директиви препроцесора.
Микола П’ясецький

8
Так, вибачте, я постійно роблю психічну помилку. $ є змінною препроцесора і! - змінна сполучна.
Роб Меншинг

20
Зауважте, що "Fileid" має бути значенням елемента <File Id = "Fileid" ...>, і, мабуть, може містити символ крапки (.).
Джеймс Хагард

6
Чи можливо це зробити і для пакета / завантажувача?
noelicus

6
Посилання на пов’язану документацію, розділ: Змінні
палітурні речовини

39

Я зробив це в одному зі своїх проектів, написавши розширення препроцесора, щоб прочитати версію файлу з мого виконуваного файлу. Отже, файл 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/


Чи продовжує працювати ваше розширення? Я спробував додати його як довідку, і сталася помилка.
Стефан Василевич

Це розширення працювало чудово з Wix 3.5, після оновлення до Wix 3.9 воно кидає NullPointerException. Очевидно, що між цими версіями щось зламалось.
Гіго

2
@Gigo Я отримав це працює через <?define ProductName="!(bind.property.ProductName)" ?><?define CompanyName="!(bind.property.Manufacturer)" ?><?define ProductVersion=!(bind.FileVersion.FileId) ?> Де FileIdце значення Idатрибута одного з ваших Fileелементів всередині Component.
Джаред

Посилання CodePlex не відкривається для мене. Чи є інший спосіб, крім написання власного розширення перед процесором?
RDV

28

Якщо хтось шукає фактичний приклад 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>

1
Це набагато краща відповідь. Дякую за робочий приклад.
рулони

де він отримує фактичний номер версії?
foobar

@foobar Пройшов деякий час, оскільки я був тут, але якщо ви подивитесь на рядок, !(bind.fileVersion.MyDLL)вона використовує 3-ю частину посиланням на <File Id="MyDLL"...розділ
K0D4

Це добре спрацювало для мене. Працює для компільованих виконуваних файлів, а також dll, що чудово підходить для закріплення інсталяційної версії та вмісту інтерфейсу користувача до інформації про збірку EXE, не змінюючи речей у кількох місцях
rcbevans

21

Ось дуже простий спосіб отримати версію пакета завантажувача Bootstrapper відповідно до вашого 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>

@AliKazmi Ви визначили своє var.ProductNameта var.BuildVersionдесь вище свого <Bundle>?
Брок Хенслі

2
Я спробував це, і не можу цього досить рекомендувати - комбінуйте його з патчером збірки для TeamCity, і ви отримаєте виграшну формулу. Я замість цього не використовував елемент Bundle, а елемент продукту і все ще працював для мене.
IbrarMumtaz

VS просто любить ігнорувати BeforeBuildціль, тому, можливо, потрібно буде чітко вказати, AfterTargets="AfterResolveReferences"чи ви будуєте в IDE
Дмитро

Я додав код Bootstrapper.wixproj у свій * .wixproj та у файл Product.wxs, я визначив змінну buildversion як:
RDV

4

Ви можете передати версію до сценарію 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 частини програмної версії. Однак ProductVersion призначений лише для використання перших 3 частин.


Дякую, це врятувало мені день. BTW: Верхній фрагмент коду переходить у проект yur (* .wxiproj). Необхідність керувати CI-побудовою Devops / VSTS - це найкраща відповідь. Оскільки у мене вже готова остання змінна версія. У моєму випадку це виявилося так: у <Version Condition=" '$(BuildVersionOfAsm)' != '' ">$(BuildVersionOfAsm)</Version>той час як BuildVersionOfAsm є змінною в девелоперах.
Robetto

Я хочу вибрати Версію динамічно, цей метод вимагає від мене продовження оновлення версії в * .wixproj. Чи є спосіб у будь-якій версії DLL у цьому полі?
RDV

@RDV Метою такого підходу є не зміна файлів у керуванні джерелом, включаючи .wixproj. Динамічний номер версії надається вашою системою CI (AppVersion та BuildNumber у цьому прикладі). Зазвичай ви встановлюєте основні та другорядні номери версій як змінні CI і дозволяєте системі CI динамічно генерувати номер збірки.
Едвард Брей

Відмінно - саме те рішення, яке мені було потрібно, включаючи стандартні налаштування для локальних версій.
ColH

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.