Friday, January 28, 2011

Создание инсталляции с помощью WIX и 7-Zip

Специально для этой статьи, я создал простую инсталляцию. Для этого с помощью визарда я создал Wix проект в Visual Studio и добавил файл license.txt, который будет копироваться в ходе инсталяции. Вот содержимое Product.wxs:
<?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 файл:

  1. Содержимое архива (.msi в нашем случае) распаковывается во временную директорию
  2. Из временной директории запускается .msi файл
  3. По окончанию инсталляции временная директория со всем содержимым удаляется

Следует заметить, что размер полученного архива в виде .exe файла в несколько раз меньше размера исходной инсталляции. В данном примере .exe файл в 2,5 раза меньше. Хоть это и небыло моей целью, т.к. мне была нужна инсталляция в виде exe-шника, этот "побочный" эффект весьма приятен :)

P.S.
В Wix 3.6 появилась тулза burn, с помощью которой можно создавать загрузчики (bootstrapper) для инсталляционных пакетов. Но, к сожалению, на момент написания статьи, версия Wix 3.6 находится в стадии разработки.

Скачать исходный код

No comments:

Post a Comment