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 FAQ
Автор: Luke Stevens
Перевод: Никита А. Зимин
«Деловые программы»
Источник: Wix FAQ
Опубликовано: 04.10.2006
Исправлено: 09.11.2006
Версия текста: 1.0
За основу документа был взят WiX FAQ от Люка Стивенса ( Luke Stevens ). При переводе акцент был сделан НЕ на точности передачи авторского стиля, а на смысле. Ряд вопросов пришлось обновить и дополнить. Кроме того, был добавлен новый раздел «Локализация».
Общие вопросы
Что такое WiX?
Windows Installer XML ( WiX ) — это набор инструментов с открытым исходным кодом, позволяющих собирать из XML-описаний пакеты формата Windows Installer .
WiX — первый продуктом компании Microsoft, который стал развиваться на площадке SourceForge и распространяться под открытой лицензией CPL (двумя другими позже стали Windows Template Library и FlexWiki).
В состав WiX входит ряд консольных утилит:
- candle — препроцессор/компилятор
- light — компоновщик
- lit — управление библиотеками
- dark — декомпилятор
- tallow — утилита для автогенерации кода
Где еще можно найти информацию по WiX?
- WiX Tutorial от Gabor DEAK JAHN — отличное введение в WiX, с наглядными примерами
- Документация в составе дистрибутива WiX — см. doc/WiX.chm
- Список рассылки wix-users на SourceForge.net.
- Информация по Windows Installer в Platform SDK — см. раздел по Windows Installer в MSDN
- Блоги разработчиков: Роб Меншинг ( Rob Mensching ), и Дерек Цицероне ( Derek Cicerone , к сожалению, он недавно покинул проект)
- Using the WiX Toolset to Integrate Setup into Your Development Process — статья в MSDN об использовании WiX и Votive
- WiX FAQ — сборник вопросов/ответов (последнее время сайт не отвечает, используйте кеш Google)
- Windows Installer XML: создание файлов инсталляции — статья на CITForum
- www.installsite.org — сайт для разработчиков инсталляторов, в том числе и для Windows Installer. Есть несколько интересных CA. Несколько статей на русском: www.installsite.ru.
- wix.sourceforge.net — сайт проекта WiX, содержит основные ссылки и документацию
- groups.google.com/group/Wixg — группа обсуждения на Google Groups
Почему бы вместо WiX не использовать … ?
- Свой скрипт или программу установки? Развернув свой проект, вы, вероятно, создадите нечто с набором функциональности, являющимся подмножеством того, что Windows Installer уже может делать за вас, и намного более надежно. Определение процесса установки в терминах данных, используемых Windows Installer, позволит операционной системе и другим инструментам более разумно управлять этим процессом, например, определить, что общие компоненты корректно установлены и обновлены, или представить ваш продукт в списке «Установка и удаление программ». Использование WiX позволит вам получить все преимущества, которые может предложить Windows Installer.
- Утилиту Orca или API? Такой подход позволит вам напрямую редактировать MSI-пакет, формат которого предназначен для работы Windows Installer, а отнюдь не для разработчиков. С помощью инструментов WiX намного проще писать инсталляторы, пакеты установки можно генерировать в автоматическом режиме. Кроме того, WiX значительно расширяет базовые возможности Windows Installer, например, добавляется возможность создать и настроить веб-сайт в IIS или базу данных в SQL Server.
- Visual Studio Installer? В Visual Studio уже имеется встроенный тип проекта для создания MSI-пакетов, но он полезен лишь для простейших случаев. В частности, он допускает лишь одну «feature», очень ограничен в настройке интерфейса и не поддерживает обновления. Кроме того, он сильно опирается на программирование процесса установки через классы инсталляции .NET (.NET installer classes). Если интеграция с Visual Studio для вас так важна — используйте Votive .
- InstallShield / Wise / итп.? Существует ряд коммерческих продуктов, упрощающих создание пакетов установки в формате Windows Installer. Они особенно полезны, если вы только начинаете разбираться с процессом установки и вам нужен дружественный интерфейс, который будет направлять вас. Но большинство опытных разработчиков программ установки приходит к тому, что лучше использовать инструмент, работающий в модели данных Windows Installer, используя все его возможности. И, кроме того, WiX имеет открытый исходный код и бесплатен!
- XCOPY? Если вы можете распространять вашу программу простым копированием файлов — так и делайте (сам WiX распространяется именно так). Но для большинства продуктов — особенно таких, которые устанавливают сервер или каким-то образом интегрируются с другими продуктами или самой Windows — процесс установки это не просто копирование (« setup isn’t just XCOPY » — первоначальное название блога Роба Меншинга).
Откуда можно скачать последнюю версию WiX?
Релизы WiX размещены на SourceForge: WiX 2.0 + Votive2, WiX 3.0 + Votive 3. Кроме того, разработчики WiX придерживаются практики еженедельных релизов.
Можно мне поучаствовать в разработке?
ДА! Вам нужно лишь подписать соглашение, после чего вы можете вносить улучшения и отсылать правки на wix-devs@sourceforge.net.
HOWTO
Как установить WiX?
Прежде всего, установите .NET Framework 1.1 и SP1 для него. Инструменты WiX работают под .NET, а без SP1 вы можете столкнуться со случайными ошибками при парсинге больших XML-файлов. .NET Framework требуется только для работы утилит WiX; готовый установочный пакет не требует присутстувия .NET на целевой машине.
При установке, WiX не требует особых настроек — достаточно развернуть .zip-архив в какую-либо папку.
Для того, чтобы при редактировании .wix-файлов в Visual Studio работал IntelliSense, нужно поместить XML-схемы WiX (wix.xsd, wixloc.xsd) в соответствующую папку:
- для Visual Studio 2005 : %ProgramFiles%\Microsoft Visual Studio 8\xml\Schemas
- для Visual Studio .NET 2003 : %ProgramFiles%\Microsoft Visual Studio .NET 2003\Common7\Packages\schemas\xml
Как работать с проектом WiX непосредственно в Visual Studio?
Именно для этого и был разработан Votive.
Votive — это расширение (Add-In) для Visual Studio. Он позволяет создавать «WiX-проекты», которые можно включать в solution и которые действуют точно так же, как и любые другие типы проектов. Все инструменты WiX включены в состав Votive, поэтому для работы с ним не требуется устанавливать WiX отдельно — это может понадобиться уже только для автоматической сборки установщика.
Есть ли простой способ нарисовать интерфейс (UI) установщика?
Существует ряд проектов, предоставляющих возможность WYSIWYG-редактирования экранов установщика:
Как мне получить новое значение GUID?
Значения GUID используются WiX в качестве идентификаторов различных объектов, таких как продукт (Product) или компонент (Component), и WiX предполагает, что вы сами выберете нужные значения и укажите их в XML-файле. Для генерации значений вы можете использовать утилиты, такие как uuidgen или guidgen (из VS — команда Tools | Create GUID), но убедитесь, что используется верхний регистр символов и значение не окружено фигурными скобками.
При работе в Visual Studio можно использовать простой макрос, на который можно назначить комбинацию клавиш, либо использовать GUIDGen.NET.
Как изменить иконку продукта, которая видна в списке «Установка и удаление программ»?
Укажите в свойстве ARPPRODUCTICON идентификатор нужной иконки. Например:
Как автоматически добавить в установщик все файлы из заданной папки?
По идее, такой возможности нет.
Разработчик должен принять обдуманное и неизменное решение о том, какие в точности файлы должны быть включены в какой компонент. Если GUID или содержание компонента изменились, то нарушаются правила компонентов, и Windows Installer уже не сможет корректно координировать разделение общих компонентов между несколькими продуктами. Автоматическое добавление всех файлов заданной директории в какой-либо компонент в ходе каждой сборки сделает невозможным сохранение неизменного содержания компонента при изменении содержимого директории.
Утилита tallow позволяет просканировать директорию и сгенерировать компоненты для всех найденных файлов, но полученный в результате исходный код предполагается использовать только в качестве начального варианта для последующей ручной доводки, но не в качестве входа для процесса автоматической сборки — все что подходит для автоматической сборки должно передаваться в candle, но никак не в tallow.
Существует инструмент mallow, позволяющий автоматически собирать список файлов в директории и поддиректориях, и генерирующий также компоненты и тэги Directory, что позволяет подключать полученный файл так, что все поддерево директорий и файлы будут включены в пакет установки и установлены в виде такого же поддерева в заданную папку.
Как зарегистрировать COM DLL?
Рекомендуемый способ состоит в том, чтобы собрать всю регистрационную информацию и включить ее в компонент (тэг Component) для этой DLL в виде тэгов TypeLib, Class, Interface, ProgID итд., и, как последнее средство — тэг Registry. В качестве начального материала вы можете использовать результат работы утилиты tallow (либо улучшенной tallow, либо wixtlib для библиотек типов). Например:
Если для DLL требуется само-регистрация, укажите в тэге File атрибут SelfRegCost:
Но имейте в виду, что использование саморегистрации крайне неодобряется, поскольку она подрывает возможность Windows Installer управлять установкой регистрационной информации.
Как установить .NET-сборку в GAC?
Установите для тэга File атрибуты Assembly и AssemblyManifest, но не указывайте атрибут AssemblyApplication. Например:
Такая сборка не будет устанавливаться до фазы «commit», поэтому до этого ее невозможно будет использовать в custom actions.
Если вы передумаете и решите не включать сборку в GAC, установите атрибут AssemblyApplication в то же значение что и атрибут AssemblyManifest.
Как проверить, установлены ли необходимые системные компоненты (prerequisites)?
Основная идея состоит в том чтобы проверять свойство, которое устанавливается по-разному в зависимости от наличия компонента и его версии. Вы можете создать условие запуска установки, поместив тэг Condition внутри Product, например:
Для проверки версии ОС вы можете использовать предопределенные свойства — такие как VersionNT или Version9X, для проверки версии .NET Framework — MsiNetAssemblySupport.
Для поиска компонента, установленного из MSI, можно использовать поиск по GUID тэгом ComponentSearch. Для компонента Windows, такого как IIS, может понадобиться поиск по реестру, например:
— этот код под Windows Server 2003 установит свойство W3SVCMAJORVERSION в значение «#6», если сервис «IIS web publishing» установлен, либо в пустое значение, если не установлен.
До установки .MSI-пакета нужно автоматически установить . Как это сделать?
Проблема установки и обновления системных компонентов (prerequisites), таких как .NET Framework, MDAC, MSDE и др., решается использованием программы-bootstrapper, задача которой — установить и обновить все нужные компоненты, после чего запустить на выполнение ваш .MSI-пакет.
Существует несколько таких программ:
Когда следует изменять код продукта, код пакета итд.?
Есть три важных GUID, которые определяют ваш установочный пакет, и которые особенно важны для обновлений продукта:
- код пакета ( Package Code ) обычно должен быт своим для каждого .msi-файла
- код продукта ( Product Code ) идентифицирует группу пакетов, из которых только один может быть установлен в каждый момент времени. Например, два пакета могут иметь один и тот же код продукта, если они являются локализациями на разные языки. Если вы хотите позволить пользователям обновляться с одной версии на другую без обязательной деинсталляции (т.н. major upgrade), то каждая версия должна иметь собственный код продукта, поэтому обычно новый выпуск с новым номером версии служит основанием для изменения кода продукта.
- код обновления ( Upgrade Code ) идентифицирует группу пакетов, все из которых могут быть обновлены до одного нового продукта. Обычно, код обновления совпадает для всех версий, которые не могут быть установлены одновременно (side-by-side), тем самым позволяя более старым версиям определять наличие более новых и отказываться от установки при этом, а также новым версиям определять наличие более старых и автоматически обновлять их.
Как я могу расширить функциональность WiX?
Хотя функциональность Windows Installer можно расширять только с помощью действий (custom actions, CA), функциональность WiX по созданию установочных пакетов можно увеличить за счет расширений. WiX может использовать расширения в виде внешних DLL, определяющих дополнения к схеме, заполняющих пользовательские таблицы итп. Читайте об этом здесь.
Локализация
Как получить .MSI-пакет на русском языке?
Под руководством Gabor DEAK JAHN существует т.н. WiX Localization Project, объединяющий усилия по написанию файлов локализации (.wxl-файлов) для всех основных языков. В дистрибутив последних версий WiX входит 4 языковых файла (для en-US, de-DE, es-ES и nl-NL), хотя еще 9 языковых файлов (в т.ч. и ru-RU) числятся в списке как завершенные.
За основу локализации берется файл WixUI_en-us.wxl, основная часть сообщений относится к Windows Installer, их перевод основывается на файле Intl.zip из MSI SDK. Перевод остальных сообщений выполняется непосредственно с англоязычного файла.
«Неофициальный» файл локализации WixUI_ru-ru.wxl можно взять здесь.
Русское имя продукта отображается как .
Во-первых, проверьте что кодировка файла совпадает с кодировкой, объявленной в начале этого файла, например:
Затем, проверьте что корректно проставлены атрибуты Codepage и Language тэга Product, а также атрибут SummaryCodepage тэга Package, например:
Разрешение проблем
Как отлаживать процесс установки?
Стоит начать с анализа лога установки, который можно получить, запустив установку командой:
Для деинсталляции используем:
Почему я получаю ошибку 0xc0000135 при попытке запуска WiX?
Если при запуске вы получаете сообщение вида:
то обычно это означает, что вы не установили .NET Framework 1.1, который требуется для работы WiX.
Почему WiX не запускается с сетевого диска?
По умолчанию, политика безопасности .NET Framework предотвращает попытки запуска кода, загруженного с потенциально небезопасных источников. Вы можете изменить эту политику с помощью утилиты CasPol:
где C:\Program Files\WiX заменяется на путь к любой копии wix.dll.
Почему при деинсталляции ничего не удаляется?
Вероятно, вы забыли назначить GUID-ы компонентам. Если для компонента не указан GUID, то Windows Installer установит его, но не будет отслеживать его или деинсталлировать его.
Если дело не в этом, то скорее всего проблема в том, что вы деинсталлируете не то же самое что было установлено, поскольку вы опираетесь на имя базы данных или виртуального каталога или что-то еще, что определено в свойстве, но это свойство изменилось, потому что…
Почему сбрасываются значения свойств, заданные в ходе установки?
Windows Installer не сохраняет значения свойств между сессиями. Если в ходе установки интерфейс запрашивает у пользователя значение свойства, и оно требуется вам на этапе поддержки или деинсталляции, то только от вас зависит, сохраняете вы его где-либо или нет. Обычно, значение свойства просто сохраняется в каком-либо ключе реестра, а в последующих сессиях значение свойства восстанавливается с использованием поиска по реестру.
Почему мое действие (custom action) выполняется в ходе деинсталляции?
По умолчанию, запланированное действие (scheduled custom action) выполняется всякий раз при запуске пакета, вне зависимости от того, происходит ли установка, деинсталляция, модификация, восстановление, что бы то ни было. Если вы хотите, чтобы действие выполнялось только в одном из этих случаев, используйте условие, такое как «NOT Installed» или «&MyFeature > 2».
Почему мой сервис не запустился?
Есть множество возможных причин. Если права пользователя достаточны, то наиболее вероятная проблема состоит в том что путь к исполняемому файлу задан неверно, что может случиться, если вы забыли задать KeyPath для компонента, содержащего сервис.