<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="39ef48c3-d7ca-4947-9644-4146e9d6c1ec" Name="WixExeSetup" Language="1033"
Version="1.0.0.0" Manufacturer="WixExeSetup"
UpgradeCode="d69d6b38-b736-44e8-98b8-d3fded2545da">
<Package InstallerVersion="200" Compressed="yes" />
<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
<UIRef Id="WixUI_Minimal"/>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="WixExeSetup">
<Component Id="license.txt" Guid="177b4634-0246-49db-89a9-c3b539ebd93d">
<File Id="license.txt" Source=".\license.txt" KeyPath="no" />
</Component>
</Directory>
</Directory>
</Directory>
<Feature Id="ProductFeature" Title="WixExeSetup" Level="1">
<ComponentRef Id="license.txt" />
</Feature>
</Product>
</Wix>
Если скомпилировать этот проект, то будет получен инсталляционный msi-пакет. Что если я захочу инсталляцию не в виде .msi, а в виде .exe (неважно из каких соображений)? Оказывается, что WIX в текущей версии этого не позволяет. Итак, после пары часов поиска, я пришёл к тому что проще всего поместить .msi файл в самораспаковывающийся (sfx) архив, после запуска которого, содержимый .msi будет распаковываться во временную папку и затем запускаться.
Для создания sfx-архива я использовал 7-Zip 9.20. Я скачал сам архиватор, а также SFX Plugin.
После этого, я установил 7-Zip и распаковал SFX Plugin в папку с 7-Zip. Чтобы была возможность использовать архиватор из командной строки во время компиляции универсальным способом я также добавил путь к папке с 7-Zip в переменную окружения PATH.
Теперь, чтобы в процессе сборки проекта инсталляция упаковывать в sfx архив в post-build action нужно добавить следующую команду:
7z a -y -sfx7zS2.sfx $(TargetName).exe $(TargetFileName)
В результате, после сборки проекта кроме .msi файла собирается также .exe файл, который содержит запакованный msi.
Теперь подробнее о том что происходит, когда запускается полученный .exe файл:
- Содержимое архива (.msi в нашем случае) распаковывается во временную директорию
- Из временной директории запускается .msi файл
- По окончанию инсталляции временная директория со всем содержимым удаляется
Следует заметить, что размер полученного архива в виде .exe файла в несколько раз меньше размера исходной инсталляции. В данном примере .exe файл в 2,5 раза меньше. Хоть это и небыло моей целью, т.к. мне была нужна инсталляция в виде exe-шника, этот "побочный" эффект весьма приятен :)
P.S.
В Wix 3.6 появилась тулза burn, с помощью которой можно создавать загрузчики (bootstrapper) для инсталляционных пакетов. Но, к сожалению, на момент написания статьи, версия Wix 3.6 находится в стадии разработки.
Скачать исходный код