Кастомизация диалоговых окон WixToolSet на примере windows installer и executable packages

Приветствую!

В этой статье я покажу вам свой вариант использования набора утилит WixToolSet для создания кастомных диалоговых окон с возможностью получения предустановленной информации (пароли, явки и прочие параметры). И приведу пример использования кастомных окон в простом кейсе.

577a3750998035a4c8fa88cc9f2a86e8.png

Тем, кому лениво читать, предлагаю ознакомиться с проектом на github.

Проект состоит из двух частей:

  1. Установщик MSI — установщик основного продукта, в задачи которого входит:
    a.  запросить пароли пользователя и рута;
    b. скопировать скрипт в назначенную папку и запустить его с параметрами, по результату работы которого мы получаем файл с паролями;
    c. открыть блокнотом итоговый файл.

  2. Установщик EXE — альтернативный установщик, который позволяет предварительно установить все необходимые компоненты для работы основного продукта, а после и сам продукт.

  3. Его задачи и то, что мы делаем:
    a. устанавливаем необходимые компоненты (в качестве примера представлен код тихой установки MSSQL Server 2016);
    b. запрашиваем пароли пользователя и рута;
    c. запускаем установщик основного продукта, где полученные пароли пользователя и рута передаем в качестве параметров (установщик основного продукта запускается в тихом режиме, без диалоговых окон);
    d. установщик основного продукта выполняет все действия, указанные в п.1, за исключением п.1.а.

Я не буду заострять внимание на основах создания проектов windows installer и executable packages, а также описывать связи между ними, так как тема данной статьи — кастомизация. Считаю, что данного кейса для демонстрации возможностей оных вполне хватает. Кто столкнулся с набором утилит впервые, предлагаю рабочий проект на github и несколько полезных ссылок в конце статьи. Поехали!

Кастомизация пакетного установщика MSI

По сценарию работы основного продукта у пользователя необходимо запросить пароли пользователя и рута, в этом нам поможет кастомное диалоговое окно.

Рисунок №1Рисунок №1

Для этого создаем в проекте файл PasswordDlg.wxs со следующим содержанием:




 
  
    
    
    
    
    
      
    
      
    
      
      
    
      
    
      
      
    
      
      
    
      
    
      
      
      
      
        1
      
    
  
  

В качестве локализации у нас будет выступать файл Variables.wxl со следующим содержанием:




  Настройка сервера
  Укажите информацию и нажмите кнопку "Далее"
  Установка [ProductName]
  Укажите пароли пользователей базы данных:
  Для обеспечения инфоромационной безопасности и сохранности корпоротивной информации, необходимо заменить пароли на более сложные
  Введите пароль:
  Далее
  Назад
  Отмена

  Пользователь:
  Пароль для пользователя:
  Пароль для рута:

Далее, нам необходимо создать свой сценарий диалоговых окон (далее — сценарий), куда будет добавлено новое окно для запроса пароля пользователя и рута. В нашем проекте мы используем сценарий WixUI_InstallDir, файл которого расположен по пути: C:\Program Files (x86)\WiX Toolset v3.11\SDK\wixui\WixUI_InstallDir.wxs.

Копируем этот файл в наш проект, предварительно переименовав в MyWixUI_InstallDir.wxs.

Набор утилит WixToolSet предоставляет несколько стандартных сценариев диалоговых окон. Список всех доступных сценариев можно посмотреть тут.

Как вы поняли из названия, сценарий представляет собой цепочку из диалоговых окон с описанием действий при нажатии на кнопки: «Далее», «Назад», «Отмена» и т.д. Нам остается всего лишь вставить свое окно в цепочку и указать ссылки на предыдущее и следующее окна.

Полный список доступных диалоговых окон можно посмотреть тут.

Содержание файла MyWixUI_InstallDir.wxs у нас следующее:



    
      
      
        WixUI_Font_Title используется в PasswordDlg.wxs
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        1
        "1"]]>
        1
        
        
        NOT Installed
        Installed AND PATCH
        
        1
        LicenseAccepted = "1"
        
        1
        
        1
        NOT WIXUI_DONTVALIDATEPATH
        "1"]]>
        WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"
        1
        1
        NOT Installed
        Installed AND NOT PATCH
        Installed AND PATCH
        1
        1
        1
        1
        
        
        
    

Теперь осталось добавить наш новый сценарий, картинки баннера и хедера в проект, для этого в файле Product.wxs указываем:






На этом вся работы выполнена, можно запускать проект и наслаждаться результатом.

Рисунок №2Рисунок №2

Кастомизация исполняемого установщика EXE

Основная цель использования альтернативного установщика EXE — инсталляция дополнительных компонентов для работы основного продукта. Также для удобства мы запросим пароли пользователя и рута, передадим их в качестве параметров в установщик MSI, который запускается в тихом режим, без демонстрации диалоговых окон.

Для наших целей нам подойдет кастомизация окна опций установщика MSI, где в качестве шаблона установщика мы используем RtfLargeTheme.xml и файл локализации RtfTheme.wxl.

Копируем эти файлы в наш проект, предварительно переименовав в MyRtfLargeTheme.xml и MyRtfTheme.wxl, соответственно. Файлы расположены тут: C:\Program Files (x86)\WiX Toolset v3.11\SDK\themes.

Чтобы попасть в опции необходимо нажать кнопку «Опции» в окне приветствия, после запуска установщика EXE, далее нам откроется окно запроса паролей пользователя и рута, как показано на рисунке 3.

Рисунок №3Рисунок №3

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




    
    
        #(loc.InstallVersion)
        #(loc.InstallAcceptCheckbox)
        
        
        
        
    




        #(loc.OptionsHeader)
          
        #(loc.OptionsUserPwd)
        DefaultUserPwd
          
        #(loc.OptionsRootPwd)
        DefaultRootPwd
        
        
        
    

Содержание файла локализации MyRtfTheme.wxl я показывать не буду, думаю, что с ним вы разберетесь самостоятельно.

Нам осталось указать получившиеся шаблон и локализацию в проект, для этого нам нужно внести изменения в файл Bundle.wxs, добавив следующее:


       
	     LicenseFile="EULA-RU.rtf"
           
	     LogoFile="logo.ico"
          
	     SuppressRepair="no"
           
          ThemeFile="MyRtfLargeTheme.xml"
          LocalizationFile="MyRtfTheme.wxl"
           
          ShowVersion="yes"/>





В итоге у нас получилась некая обертка, которая позволяет установить все необходимые зависимости или компоненты для вашего продукта, а после сам продукт, предварительно запросив всю необходимую информацию.

Рисунок №4Рисунок №4

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

Надеюсь, сильно ругать не будете, это моя первая статья. Проба пера!

Всем спасибо и до скорого!

Автор статьи: Сокол Даниил

П.С. Полезные ссылки для изучения набора утилит WixToolSet.

Статьи от @Terror, где описаны основы работы с wixtoolset:

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

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

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

  • Статья от автора @Revolution, где описан прекрасный способ сборки пакета msi со сторонними файлами:

  • Автоматическое добавление файлов в WiX инсталлятор.

© Habrahabr.ru