<?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 находится в стадии разработки.
Скачать исходный код
No comments:
Post a Comment