Wix windows installer xml wix

Алексей Пахунов

… также известный как “Not a kernel guy”

Copyright © 2006 — 2021 License
Powered by Hugo and Hyde-X

Windows Installer XML (WiX) toolset

Неожиданно для себя наткнулся на замечательный инструмент для создания инсталляций — Windows Installer XML (WiX) toolset. Еще на прошлой неделе я был уверен, что поиски удобной среды для создания инсталляций под Windows Installer обернутся просмотром длинного списка коммерческих утилит и «наколенных» поделок. В качестве эталона для сравнения выступала Inno Setup – довольно удобная и простая в использовании программа. Кроме того Inno Setup бесплатна, что делало шансы на победу коммерческого инсталлятора мизерными.

В общем, я был заранее уверен что ничего путного не найдется и придется использовать традиционный Inno Setup. Тем не менее на глаза попался WiX и стало понятно, что Inno Setup пора отправлять на покой. Заранее скажу, что тут дело не в том, какой WiX хороший, а в том, что он использует Windows Installer. А Windows Installer это все-таки стандарт.

Во-первых, инсталляция описывается в виде XML имеющем логичную структуру. В большинстве случаев, чтобы понять код, документация не требуется. Кроме того, в Visual Studio для файлов WiX работает автодополнение, так что и для написания кода документация не нужна;

Вo-вторых, несмотря на то, что нужда в документации возникает не часто, она (документация) есть! Причем это достаточно подробная и удобная документация. Для начинающих, в наличии имеется пошаговое описание с чего начать и как все работает;

В-третьих, WiX это качественно написанная программа. Это трудно объяснить, это надо почувствовать. По крайней мере меня не покидает ощущение, что все необходимые мелочи продуманы и доделаны, а непродуманные и недоделанные мелочи, если они есть, и так никому не нужны; 🙂

В-четвёртых, существуют GUI надстройки над WiX, в том числе плагин для Visual Studio – Votive;

В-пятых, есть ещё много мелких преимуществ вроде легкости автоматизации или бесплатности WiX.

WiX это просто очень тонкая прослойка между программистом и Windows Installer. Она не расширяет функциональность Windows Installer и не скрывает его возможности. WiX просто здорово облегчает процесс создания инсталляций, делая его осознанным и управляемым.

WiX (Windows Installer Xml), Create universal variables

I was studying for WiX for several days through some online tutorial. I saw three cases to create some variables

  1. and then use the value as $(var.Variable)
  2. Create a localization file. Type in content as Value and then use the value as !(loc.Variable)
  3. Create a include file. Type in content as

and then include the file, use the property in Fragment as [VARIABLE]

I know the localization file is mainly used for different locales. But I don’t know when we should use each case. Can anyone help explain?

1 Answer 1

I haven’t used these constructs that much. However, I think Bob Arnson (WiX developer) explains this pretty well in this blog entry about localization (the explanation is good, but I still manage to confuse myself — carbon error).

Essentially:

  • Preprocessor variables$(var.Variable) — are resolved by the WiX preprosessor — it happens before compilation ( Candle.exe ).
  • Localization variables!(loc.LanguageLcid) — are resolved at link time ( Light.exe ). The linking process can spit out multiple MSI files in different languages. Hence localization is a link-time process.
  • See link 3 below for a localization sample. Once you localize, you localize most or all fields. In the sample below I don’t localize version and upgrade code — they remain the same for all output MSI files.
  • You have to determine in each case what should be localized. Should the Manufacturer name be localized? Perhaps if you want Asian characters for Asian setups, and an equivalent Latin character name otherwise?
  • Include files are simply included in the WiX source before compilation. It is like including a header file in C++. This makes it a preprocessor construct. See link 2 below for a discussion of the use of include files.
  • UPDATE: There are also Burn Engine Variables — if you make setup.exe launchers with WiX.
    • https://wixtoolset.org/documentation/manual/v3/xsd/wix/variable.html
  • WixVariable:
    • https://wixtoolset.org/documentation/manual/v3/xsd/wix/wixvariable.html
    • WixVariable Sample

I am sure there are other technical reasons as well. Rob or Bob would need to illuminate. There could also be differences in WiX 4 than what I am used to in WiX 3 — and there could be changes planned that I am unaware of.

WiX Toolset

What is WiX?

WiX is a set of tools that allows you to create Windows Installer-based deployment packages for your application. The WiX toolset is based on a declarative XML authoring model. You can use WiX on the command line by using the WiX tools or MSBuild. In addition, there is also a WiX Visual Studio plug-in that supports VS2005, VS2008, and VS2010. The WiX toolset supports building the following types of Windows Installer files:

  • Installer (.msi)
  • Patches (.msp)
  • Merge Modules (.msm)
  • Transforms (.mst)

WiX supports a broad spectrum of Windows Installer features. In addition, WiX also offers a set of built-in custom actions that can be used and incorporated in Windows Installer packages. The custom actions are offered in a set of WiX extensions. Some common WiX extensions include support for Internet Information System (IIS), Structured Query Language (SQL), the .NET Framework, Visual Studio, and Windows etc.

How does WiX work?

The WiX source code is written in XML format with a .wxs file extension. The WiX tools follow the traditional compile and link model used to create executables from source code. At build time, the WiX source files are validated against the core WiX schema, then processed by a preprocessor, compiler, and linker to create the final result. There are a set of WiX tools that can be used to produce different output types. For a complete list of file types and tools in WiX, see the File Types and the List of Tools sections.

See the following topics for more detailed information:

WiX system requirements

WiX supports both .NET 3.5 and 4.0 and later. WiX’s MSBuild supports requires .NET 3.5, which is not installed by default on Windows 8 and Windows Server 2012 and later. To install the .NET 3.5 feature, go to Control Panel, open Programs and Features, and choose Turn Windows features on or off. In the list of features, choose .NET Framework 3.5 (includes .NET 2.0 and 3.0) and then choose OK.

WiX Toolset

WiX Toolset

The most powerful set of tools available to create your Windows installation experience.

The WiX Toolset

Integrates seamlessly

into build processes to create Windows installation packages.

Documentation

There are lots of ways to learn about the WiX toolset.

Download

You can download the WiX toolset for free.

If you find a bug, let us know so we can fix it.

About the WiX toolset

The WiX toolset lets developers create installers for Windows Installer, the Windows installation engine.

The core of WiX is a set of build tools that build Windows Installer packages using the same build concepts as the rest of your product: source code is compiled and then linked to create executables; in this case .exe setup bundles, .msi installation packages, .msm merge modules, and .msp patches. The WiX command-line build tools work with any automated build system. Also, MSBuild is supported from the command line, Visual Studio, and Team Build.

WiX includes several extensions that offer functionality beyond that of Windows Installer. For example, WiX can install IIS web sites, create SQL Server databases, and register exceptions in the Windows Firewall, among others.

With Burn, the WiX bootstrapper, you can create setup bundles that install prerequisites like the .NET Framework and other runtimes along with your own product. Burn lets you download packages or combine them into a single downloadable .exe.

The WiX SDK includes managed and native libraries that make it easier to write code that works with Windows Installer, including custom actions in both C# and C++.

Recent news

WiX Toolset v3.11.2 released 2019/09/18

WiX v3.11.2 is a minor security release of WiX. If your application directly references Microsoft.Deployment.Compression.Cab.dll or Microsoft.Deployment.Compression.Zip.dll to decompress cabinet or zip files to a folder, you should upgrade to this release.

Read more about the release at FireGiant’s blog.

WiX Toolset Visual Studio Extension v1.0 released (with VS2019 support) 2019/07/16

Today the WiX Toolset Visual Studio Extension v1.0 (Votive v1.0) was published to the Visual Studio marketplace. This includes support for Visual Studio 2019. Huge thanks to the team at FireGiant for their persistence with the publishing process.

You can find it all on the Downloads page.

WiX Toolset v3.10.4 and v3.11.1 released 2017/12/31

WiX v3.10.4 and WiX v3.11.1 are important security releases of WiX. We strongly encourage all users of WiX to upgrade to WiX v3.11.1. If you must remain on a WiX v3.10 release, we highly recommend upgrading to WiX v3.10.4.

Read more about the release at FireGiant’s blog.

Other sources of news

The following blogs may have additional news about the progress of the WiX toolset:

Создание инсталлятора с помощью WiX

Для начала — что такое WiX? Технология WiX (Windows Installer XML) представляет собой набор инструментов и спецификаций упрощающих процесс создания дистрибутивов на базе MSI (Microsoft Installer). Если объяснять проще то это обертка вокруг MSI с человеческим лицом.

На мой взгляд изучать проще всего на простых примерах. В данной статье я приведу пример простейшего инсталлятора.

Для начала поставим условия задачи — необходимо создать установочный дистрибутив, который будет содержать следующие диалоги:

Для создания дистрибутива нам понадобится сам WiX, последнюю версию которого всегда можно скачать на Source Forge. На данный момент последняя версия 3.5.0828.0.

Необходимо скачать и установить:
1. ProjectAggregator2.msi — нужен, для того, чтобы установить Votive (находится внутри дистрибутива номер 2). Который, в свою очередь, является дополнением для Visual Studio, облегчающим процесс работы с WiX (подсветка синтаксиса, IntelliSense).
2. Wix35.msi или Wix35_x64.msi (в зависимости от платформы)
3. Русский языковой файл

Итак, скачали, установили, запускаем Visual Studio. Меню File -> New Project, если все установлено правильно — появился новый раздел Windows Installer XML. Выбираем шаблон проекта Setup Project, вводим название проекта (я оставил как есть SetupProject1).

Проект будет состоять из одного файла Product.wxs с ним мы и будем работать. В моем случае файл выглядел следующим образом:

xml version =»1.0″ encoding =»UTF-8″ ? >
Wix xmlns =»http://schemas.microsoft.com/wix/2006/wi» >
Product Id =»b7bc7c6f-9a4e-4973-be84-eca8e3427c97″ Name =»SetupProject1″ Language =»1033″ Version =»1.0.0.0″ Manufacturer =»SetupProject1″ UpgradeCode =»06a81104-1e30-463d-87e1-e8a79b4c682a» >
Package InstallerVersion =»200″ Compressed =»yes»/>

Media Id =»1″ Cabinet =»media1.cab» EmbedCab =»yes»/>

Directory Id =»TARGETDIR» Name =»SourceDir» >
Directory Id =»ProgramFilesFolder» >
Directory Id =»INSTALLLOCATION» Name =»SetupProject1″ >

—>

—>
Directory >
Directory >
Directory >

Feature Id =»ProductFeature» Title =»SetupProject1″ Level =»1″ >

—>
Feature >
Product >
Wix >

* This source code was highlighted with Source Code Highlighter .

Для начала настроим внешний вид и добавим поддержку русского языка.

Начнем с добавления русского языка. Для этого:
1. В ключе Product изменяем 1033 на 1049
2. В свойствах проекта (правой клавишей по названию проекта в Solution Explorer -> Properties), закладка Build, в поле Cultures to build вставляем ru-RU
3. Добавляем к проекту (правой клавишей по названию проекта в Solution Explorer -> Add -> Existing Item) файл WixUI_ru-ru.wxl (из архива WixUI_ru-ru.v3.zip)

В сгенерированном проекте нет ни одного диалогового окна. Существуют два варинта добавления диалоговых окон — создавать самостоятельно, либо воспользоваться готовым набором диалоговых окон.

Мы пойдем вторым путем, начинать знакомство лучше с простого. Для этого необходимо добавить ссылку на WixUIExtension.dll (правой клавишей по названию проекта в Solution Explorer -> Add Reference — открываем папку, в которую был установлен WiX, подкаталог bin)

Ссылку добавили, указываем какой набор мы будем использовать, в конце раздела Product добавим

Property Id =»WIXUI_INSTALLDIR» Value =»INSTALLLOCATION» > Property >
WixVariable Id =»WixUILicenseRtf» Overridable =»yes» Value =»License.rtf»/>
UIRef Id =»WixUI_InstallDir»/>

* This source code was highlighted with Source Code Highlighter .

WixVariable — указывает на путь к файлу лицензии (речи о нем пока не шло, добавили сразу, чтобы два раза не ходить).
WixUI_InstallDir — готовый набор диалоговых окон. Данный набор включает все необходимые нам диалоги. Помимо него так же существуют наборы WixUI_Advanced, WixUI_Mondo, WixUI_FeatureTree, WixUI_InstallDir, WixUI_Minimal.

Приготовления закончены, можно приступать к редактированию файла установки. Для начала посмотрим, что нам нагенерила студия:

Ключ Product — описывает свойства продукта.
Id — идентификатор продукта, уникальный GUID.
Name — название продукта
Language — язык пакета установки
Version — версия продукта
Manufacturer — производитель
UpgradeCode — уникальный GUID

Чтобы упростить себе жизнь определим некоторые переменные. Для чего — название продукта, например, не раз может встречаться в скрипте, если нам захочется его изменить придется искать его по всему скрипту и менять на новое. Чтобы избежать этого определим переменную, которая будет содержать название продукта и, в случае необходимости, будем менять только ее. Над разделом Product добавим:

define ProductName =»SetupProject1″ ? >
define ProductVersion =»1.0.0.0″ ? >
define ProductCode =»b7bc7c6f-9a4e-4973-be84-eca8e3427c97″ ? >
define UpgradeCode =»06a81104-1e30-463d-87e1-e8a79b4c682a» ? >
define Manufacturer =»MyCompany» ? >

* This source code was highlighted with Source Code Highlighter .

Теперь заменим значение параметров ключа Product на переменные:

Product Id =»$(var.ProductCode)» Name =»$(var.ProductName)» Language =»1049″ Version =»$(var.ProductVersion)» Manufacturer =»$(var.Manufacturer)» UpgradeCode =»$(var.UpgradeCode)» >

* This source code was highlighted with Source Code Highlighter .

Определимся теперь с тем куда мы будем устанавливать наш продукт.

Ключ Directory — определяет путь для установки.
Directory корневой элемент для всех папок, которые будут использоваться для установки проекта.
Directory папка Program Files (на что указывает
Directory папка с именем SetupProject1 в папке Program Files. Заменим сразу Name=«SetupProject1» на Name=»$(var.ProductName)»

Добавим файлы в пакет установки. Для этого сначала добавим устанавливаемые компоненты. Следуя совету «Remove the comments around this Component» уберем комментарии с Component внутри целевой папки и добавим туда, например, калькулятор.

Component Id =»ProductComponent» Guid =»b11556a2-e066-4393-af5c-9c9210187eb2″ >
File Id =’Calc’ DiskId =’1′ Source =’C:\WINDOWS\system32\calc.exe’/>
Component >

* This source code was highlighted with Source Code Highlighter .

Установка компонента невозможна без включения его в одну из Feature (если честно не уверен как в данном случае можно перевести этот термин на русский язык). Этот элемент может быть использован когда нам необходимо дать пользователю возможность выбора, что устанавливать, а что нет. В условиях нашей задачи ничего не говорилось о возможности выбора, но несмотря на это нам необходимо привязать описанный Component к одной единственной Feature:

Feature Id =»ProductFeature» Title =»$(var.ProductName)» Level =»1″ >
ComponentRef Id =»ProductComponent»/>
Feature >

* This source code was highlighted with Source Code Highlighter .

Осталось добавить ярлык в меню Пуск.

Сначала укажем, что мы собираемся работать с папкой меню Пуск и хотим там создать папку с именем нашей программы, содержащую ярлык на калькулятор.

В раздел Directory где-нибудь в конце добавляем:

Directory Id =»ProgramMenuFolder» >
Directory Id =»ApplicationProgramsFolder» Name =»$(var.ProductName)» >
Component Id =»ApplicationShortcutCalc» Guid =»4CEBD68F-E933-47f9-B02C-A4FC69FDB551″ >
Shortcut Id =»ShortcutCalc»
Name =»Calc»
Description =»$(var.ProductName)»
Target =»[INSTALLLOCATION]Calc.exe»
WorkingDirectory =»INSTALLLOCATION»/>
RemoveFolder Id =»ApplicationProgramsFolder» On =»uninstall»/>
RegistryValue Root =»HKCU» Key =»Software\$(var.Manufacturer)\$(var.ProductName)» Name =»installed» Type =»integer» Value =»1″ KeyPath =»yes»/>
Component >
Directory >
Directory >

* This source code was highlighted with Source Code Highlighter .

Начинаем разбираться:
Directory — указывает на директорию, в которой содержатся ярлыки меню Пуск.
Directory — папка нашей программы в меню Пуск
Component — компонент, содержащий ярлык (не забыть включить его в Feature)
Shortcut — собственно ярлык к калькулятору

Финальная версия файла должна выглядеть так:

Wix xmlns =»http://schemas.microsoft.com/wix/2006/wi» >
define ProductName =»SetupProject1″ ? >
define ProductVersion =»1.0.0.0″ ? >
define ProductCode =»b7bc7c6f-9a4e-4973-be84-eca8e3427c97″ ? >
define UpgradeCode =»06a81104-1e30-463d-87e1-e8a79b4c682a» ? >
define Manufacturer =»MyCompany» ? >

Product Id =»$(var.ProductCode)» Name =»$(var.ProductName)» Language =»1049″ Version =»$(var.ProductVersion)» Manufacturer =»$(var.Manufacturer)» UpgradeCode =»$(var.UpgradeCode)» >
Package InstallerVersion =»200″ Compressed =»yes»/>

Media Id =»1″ Cabinet =»media1.cab» EmbedCab =»yes»/>

Directory Id =»TARGETDIR» Name =»SourceDir» >
Directory Id =»ProgramFilesFolder» >
Directory Id =»INSTALLLOCATION» Name =»$(var.ProductName)» >
Component Id =»ProductComponent» Guid =»b11556a2-e066-4393-af5c-9c9210187eb2″ >
File Id =’Calc’ DiskId =’1′ Source =’C:\WINDOWS\system32\calc.exe’/>
Component >
Directory >
Directory >
Directory Id =»ProgramMenuFolder» >
Directory Id =»ApplicationProgramsFolder» Name =»$(var.ProductName)» >
Component Id =»ApplicationShortcutCalc» Guid =»4CEBD68F-E933-47f9-B02C-A4FC69FDB551″ >
Shortcut Id =»ShortcutCalc»
Name =»Calc»
Description =»$(var.ProductName)»
Target =»[INSTALLLOCATION]Calc.exe»
WorkingDirectory =»INSTALLLOCATION»/>
RemoveFolder Id =»ApplicationProgramsFolder» On =»uninstall»/>
RegistryValue Root =»HKCU» Key =»Software\$(var.Manufacturer)\$(var.ProductName)» Name =»installed» Type =»integer» Value =»1″ KeyPath =»yes»/>
Component >
Directory >
Directory >
Directory >

Feature Id =»ProductFeature» Title =»SetupProject1″ Level =»1″ >
ComponentRef Id =»ProductComponent»/>
ComponentRef Id =»ApplicationShortcutCalc»/>
Feature >

Property Id =»WIXUI_INSTALLDIR» Value =»INSTALLLOCATION» > Property >
WixVariable Id =»WixUILicenseRtf» Overridable =»yes» Value =»License.rtf»/>
UIRef Id =»WixUI_InstallDir»/>

* This source code was highlighted with Source Code Highlighter .

Делаем Build, запускаем, проверяем результат.

Читайте также:  Call from microsoft windows
Оцените статью