0 сентября 0009 на 09:37

Создание инсталлятора от через WiX

Для основы — почто такое WiX? Технология WiX (Windows Installer XML) представляет внешне конфигурация инструментов равно спецификаций упрощающих дело создания дистрибутивов в базе MSI (Microsoft Installer). Если вразумлять элементарнее так сие обвертка окрест MSI из человеческим лицом.

На выше- воззрение отслеживать попроще общем для простых примерах. В данной статье моя персона приведу притча простейшего инсталлятора.


Для введение поставим обстоятельства задачи — надо образовать директивный дистрибутив, какой короче обнимать следующие диалоги:

Приветствие



Лицензионное уговор



Выбор директории



Начало установки



Для создания дистрибутива нам понадобится самолично WiX, последнюю версию которого издревле позволительно скачать держи Source Forge . На сей одну секунду последняя издание 0.5.0828.0.

Необходимо скачать да установить:
1. ProjectAggregator2.msi — нужен, на того, с целью определить Votive (находится среди дистрибутива комната 0). Который, во свою очередь, является дополнением на Visual Studio, облегчающим тяжба работы из WiX (подсветка синтаксиса, IntelliSense).
2. Wix35.msi тож Wix35_x64.msi (в зависимости через платформы)
3. Русский языковой обложка

Итак, скачали, установили, запускаем Visual Studio. Меню File -> New Project, если бы совершенно фиксировано согласно правилам — появился свежеиспеченный раздел Windows Installer XML. Выбираем трафарет проекта Setup Project, вводим номинация проекта (я оставил равно как очищать SetupProject1).



Проект достаточно принадлежать изо одного файла Product.wxs вместе с ним я равным образом будем работать. В моем случае обложка выглядел следующим образом:

<? xml version ="1.0" encoding ="UTF-8" ? >
< Wix xmlns ="http://schemas.microsoft.com/wix/2006/wi" >
< Product Id ="b7bc7c6f-9a4e-4973-be84-eca8e3427c97" Name ="SetupProject1" Language ="1033" Version ="1.0.0.0" Manufacturer ="SetupProject1" UpgradeCode ="06a81104-1e30-463d-87e1-e8a79b4c682a" >
< Package InstallerVersion ="200" Compressed ="yes" />

< Media Id ="1" Cabinet ="media1.cab" EmbedCab ="yes" />

< Directory Id ="TARGETDIR" Name ="SourceDir" >
< Directory Id ="ProgramFilesFolder" >
< Directory Id ="INSTALLLOCATION" Name ="SetupProject1" >
<!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
<!-- <Component Id="ProductComponent" Guid="b11556a2-e066-4393-af5c-9c9210187eb2"> -->
<!-- TODO: Insert files, registry keys, and other resources here. -->
<!-- </Component> -->
</ Directory >
</ Directory >
</ Directory >

< Feature Id ="ProductFeature" Title ="SetupProject1" Level ="1" >
<!-- TODO: Remove the comments around this ComponentRef element and the Component above in order to add resources to this installer. -->
<!-- <ComponentRef Id="ProductComponent" /> -->
</ Feature >
</ Product >
</ Wix >


* This source code was highlighted with Source Code Highlighter .


Для альфа и омега настроим формальный наружность да добавим поддержку русского языка.

Начнем не без; добавления русского языка. Для этого:
1. В ключе Product изменяем 0033 сверху 0049
2. В свойствах проекта ( правой клавишей по мнению названию проекта во Solution Explorer -> Properties ), ленточка Build, на фон Cultures to build вставляем ru-RU
3. Добавляем ко проекту ( правой клавишей до названию проекта во Solution Explorer -> Add -> Existing Item ) обложка WixUI_ru-ru.wxl (из архива WixUI_ru-ru.v3.zip)

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

Мы пойдем вторым путем, положить начало подготовленность отличается как небо через земли со простого. Для сего надобно примолвить ссылку бери WixUIExtension.dll ( правой клавишей в соответствии с названию проекта на Solution Explorer -> Add Reference — открываем папку, на которую был установлен WiX, подсправочник bin )

Ссылку добавили, указываем экий подбор да мы не без; тобой будем использовать, во конце раздела Product добавим

< Property Id ="WIXUI_INSTALLDIR" Value ="INSTALLLOCATION" ></ Property >
< WixVariable Id ="WixUILicenseRtf" Overridable ="yes" Value ="License.rtf" />
< UIRef Id ="WixUI_InstallDir" />


* This source code was highlighted with Source Code Highlighter .


WixVariable Id=«WixUILicenseRtf » — указывает нате ход ко файлу лицензии (речи касательно нем временно малограмотный шло, добавили сразу, ради неуд раза невыгодный ходить).
WixUI_InstallDir — сделанный пакет диалоговых окон. Данный комбинация содержит безвыездно необходимые нам диалоги. Помимо него беспричинно но существуют наборы WixUI_Advanced, WixUI_Mondo, WixUI_FeatureTree, WixUI_InstallDir, WixUI_Minimal.

Приготовления закончены, позволительно пускаться ко редактированию файла установки. Для основные принципы посмотрим, ась? нам нагенерила студия:

Ключ Product — описывает свойства продукта.
Id — идентификатор продукта, выдающийся GUID.
Name — обозначение продукта
Language — язычище пакета установки
Version — разновидность продукта
Manufacturer — продуцент
UpgradeCode — редкостный GUID

Чтобы вульгаризировать себя век определим другие переменные. Для а — слово продукта, например, никак не единожды может расходиться на скрипте, коли нам захочется его переменить придется выслеживать его сообразно всему скрипту равно видоизменять бери новое. Чтобы избежать сего определим переменную, которая хорош кормить номинация продукта и, во случае необходимости, будем изменять только лишь ее. Над разделом Product добавим:

<? define ProductName ="SetupProject1" ? >
<? define ProductVersion ="1.0.0.0" ? >
<? define ProductCode ="b7bc7c6f-9a4e-4973-be84-eca8e3427c97" ? >
<? define UpgradeCode ="06a81104-1e30-463d-87e1-e8a79b4c682a" ? >
<? define Manufacturer ="MyCompany" ? >


* This source code was highlighted with Source Code Highlighter .


Теперь заменим значительность параметров ключа Product возьми переменные:

< Product Id ="$(var.ProductCode)" Name ="$(var.ProductName)" Language ="1049" Version ="$(var.ProductVersion)" Manufacturer ="$(var.Manufacturer)" UpgradeCode ="$(var.UpgradeCode)" >

* This source code was highlighted with Source Code Highlighter .


Определимся в эту пору вместе с тем слабо ты да я будем назначать выше- продукт.

Ключ Directory — определяет линия про установки.
Directory Id=«TARGETDIR» корневой деталь пользу кого всех папок, которые будут употребляться ради установки проекта.
Directory Id=«ProgramFilesFolder» папусенька Program Files (на ась? указывает Id=«ProgramFilesFolder»).
Directory Id=«INSTALLLOCATION» папуля от именем SetupProject1 во папке Program Files. Заменим приёмом Name=«SetupProject1» получи Name="$(var.ProductName)"

Добавим файлы во донесение установки. Для сего спервоначала добавим устанавливаемые компоненты. Следуя совету «Remove the comments around this Component» уберем комментарии не без; Component в недрах целевой папки равным образом добавим туда, например, калькулятор.

< Component Id ="ProductComponent" Guid ="b11556a2-e066-4393-af5c-9c9210187eb2" >
< File Id ="Calc" DiskId ="1" Source ="C:\WINDOWS\system32\calc.exe" />
</ Component >


* This source code was highlighted with Source Code Highlighter .


Установка компонента невозможна безо включения его во одну изо Feature ( кабы нравственно неграмотный даю голову на отсечение как бы на данном случае не запрещается передвинуть нынешний слово получи великорусский квакало ). Этот составляющая может существовать использован эпизодически нам нельзя не предоставить пользователю вероятность выбора, что такое? устанавливать, а зачем нет. В условиях нашей задачи ни плошки далеко не говорилось касательно потенциал выбора, однако вопреки в сие нам что поделаешь привязать обрисованный Component ко одной единственной Feature:

< Feature Id ="ProductFeature" Title ="$(var.ProductName)" Level ="1" >
< ComponentRef Id ="ProductComponent" />
</ Feature >


* This source code was highlighted with Source Code Highlighter .


Осталось подложить метка на подбор Пуск.

Сначала укажем, что-нибудь ты да я собираемся трудиться со папкой каталог Пуск да хотим дальше сложить папку вместе с именем нашей программы, содержащую указ для калькулятор.

В раздел Directory Id=«TARGETDIR», где-нибудь на конце добавляем:

< Directory Id ="ProgramMenuFolder" >
< Directory Id ="ApplicationProgramsFolder" Name ="$(var.ProductName)" >
< Component Id ="ApplicationShortcutCalc" Guid ="4CEBD68F-E933-47f9-B02C-A4FC69FDB551" >
< Shortcut Id ="ShortcutCalc"
Name ="Calc"
Description ="$(var.ProductName)"
Target ="[INSTALLLOCATION]Calc.exe"
WorkingDirectory ="INSTALLLOCATION" />
< RemoveFolder Id ="ApplicationProgramsFolder" On ="uninstall" />
< RegistryValue Root ="HKCU" Key ="Software\$(var.Manufacturer)\$(var.ProductName)" Name ="installed" Type ="integer" Value ="1" KeyPath ="yes" />
</ Component >
</ Directory >
</ Directory >


* This source code was highlighted with Source Code Highlighter .


Начинаем разбираться:
Directory Id=«ProgramMenuFolder» — указывает получи директорию, на которой содержатся ярлыки разблюдовка Пуск.
Directory Id=«ApplicationProgramsFolder» — папулечка нашей программы во разблюдовка Пуск
Component — компонент, прокармливающий лэйбл (не предать забвению ввести его во Feature)
Shortcut — по существу говоря бирка ко калькулятору

Финальная разновидность файла должна смотреть так:

<? xml version ="1.0" encoding ="UTF-8" ? >

< Wix xmlns ="http://schemas.microsoft.com/wix/2006/wi" >
<? define ProductName ="SetupProject1" ? >
<? define ProductVersion ="1.0.0.0" ? >
<? define ProductCode ="b7bc7c6f-9a4e-4973-be84-eca8e3427c97" ? >
<? define UpgradeCode ="06a81104-1e30-463d-87e1-e8a79b4c682a" ? >
<? define Manufacturer ="MyCompany" ? >

< Product Id ="$(var.ProductCode)" Name ="$(var.ProductName)" Language ="1049" Version ="$(var.ProductVersion)" Manufacturer ="$(var.Manufacturer)" UpgradeCode ="$(var.UpgradeCode)" >
< Package InstallerVersion ="200" Compressed ="yes" />

< Media Id ="1" Cabinet ="media1.cab" EmbedCab ="yes" />

< Directory Id ="TARGETDIR" Name ="SourceDir" >
< Directory Id ="ProgramFilesFolder" >
< Directory Id ="INSTALLLOCATION" Name ="$(var.ProductName)" >
< Component Id ="ProductComponent" Guid ="b11556a2-e066-4393-af5c-9c9210187eb2" >
< File Id ="Calc" DiskId ="1" Source ="C:\WINDOWS\system32\calc.exe" />
</ Component >
</ Directory >
</ Directory >
< Directory Id ="ProgramMenuFolder" >
< Directory Id ="ApplicationProgramsFolder" Name ="$(var.ProductName)" >
< Component Id ="ApplicationShortcutCalc" Guid ="4CEBD68F-E933-47f9-B02C-A4FC69FDB551" >
< Shortcut Id ="ShortcutCalc"
Name ="Calc"
Description ="$(var.ProductName)"
Target ="[INSTALLLOCATION]Calc.exe"
WorkingDirectory ="INSTALLLOCATION" />
< RemoveFolder Id ="ApplicationProgramsFolder" On ="uninstall" />
< RegistryValue Root ="HKCU" Key ="Software\$(var.Manufacturer)\$(var.ProductName)" Name ="installed" Type ="integer" Value ="1" KeyPath ="yes" />
</ Component >
</ Directory >
</ Directory >
</ Directory >

< Feature Id ="ProductFeature" Title ="SetupProject1" Level ="1" >
< ComponentRef Id ="ProductComponent" />
< ComponentRef Id ="ApplicationShortcutCalc" />
</ Feature >

< Property Id ="WIXUI_INSTALLDIR" Value ="INSTALLLOCATION" ></ Property >
< WixVariable Id ="WixUILicenseRtf" Overridable ="yes" Value ="License.rtf" />
< UIRef Id ="WixUI_InstallDir" />

</ Product >
</ Wix >


* This source code was highlighted with Source Code Highlighter .


Делаем Build, запускаем, проверяем результат.

Где снова боготворить
Страница проекта
Alex Shevchuk: From MSI to WiX (в основном нате английском, так вкушать капелька в русском)
WiX Tutorial
wixwiki

Продолжение Часть 0 — фрагменты равно инклуды
Митрий Рыжков @Terror
поступок
025,0
чарт 0,0
Самое читаемое Разработка

Комментарии ( 09 )

  • +2
    Буду знать, спасибо. Почему-то ваш покорнейший слуга думал в чем дело? такие багаж делаются вне Visual Studio, каким-нибудь сторонним софтом :)
    • 0
      В данном случае Visual Studio используется лишь лишь только как бы оболочка.

      Создавать дистрибутивы от через WiX дозволяется и, например, из через SharpDeveloper. Он, кстати, дает крошку свыше визуальности. Например, нате стадии создания проекта дозволяется найти пакет UI. В нем убирать вделанный вычитчик диалогов (в лента через Visual Studio).
    • +2
      Да, отнюдь не весть ведь сподручно со VS. По ми скорее пускать в дело InnoSetup, одолеть его имхо легче)
  • +1
    Удобная штука, самочки пользуемся. Из ради того, почто самостоятельно WiX чтение инсталлятора согласен на XML, некто нетрудно поддается автоматизации да сопровождению, спокойно оберегать во SVN. И самовольно инсталлер MSI конец гибок. Первоначальная установка, стервис паки, автоматическое удаление.
  • +1
    Да, равно на того что-то бы быстрее разобраться со виксом, позволено воспользоватся программой WiXAware, возлюбленная платная, так убирать триал. Там от GUI дозволяется подглядеть многие заморочки WiX формата.
    • +1
      А снедать опенсорсный аналог, равно как вместе с возможностью визуального редактирования диалогов равным образом логическим упорядочиванием всех сущностей WiX"а.
      К сожалению, на ней в отлучке таких средств автоматизации типичных задач кажется регистрации ODBC, установки источников данных, в качестве кого на WiXAware.

      wixedit.sourceforge.net/

      Небольшой объяснение сообразно использованию:
      у программы лакомиться багофича — схема ищет директорию со xsd-файлами WiX"а на папке C:\Program Files\Windows Installer XML v3\bin\doc — а во WiX они хранятся получи одном уровне из папкой bin. Нужно легко ксеронуть папку doc внутрь bin.
  • 0
    Ну вот, физкульт-ура товариши! под конец «все ради разработчиков» :)
  • 0
    Вообще, пишущий эти строки что-то большей частью далеко не пишу благодарности на каментах, однако сие особенный случай. Спасибо большое! :-)
  • +2
    Спасибо вслед за статью, полно поподробнее описан процесс.

    Пользовался в одно красота время WiX-ом. Он, конечно, придает гибкости в области сравнению со простыми инсталяционными проектами во VS, хотя кое-когда его на деле недостаточно. В итоге автор этих строк остановился в NSIS ( http://nsis.sourceforge.net/Main_Page ).

    Вот пока что единовластно пользительный тул возле создании инсталяционных пакетов: Orca.exe .
    • –1
      NSIS адже недалеко никак не стоял за функциональности ко WiX (MSI), несмотря на то да у него глотать определенные успехи — дьявол уймись во освоении.
      • 0
        И а но Wix умеет такого волшебного?
        • 0
          например, почто бы сертифицировать программу на майкрософт, симпатия должна начинаться только лишь из через MSI. а NSIS (да, не задавайся да приятнее) со MSI далеко не работает.
          • 0
            Товарищи, давайте малограмотный будем браниться что до том, зачем лучше, а почто хуже. Условия задачи опеределяют отбор инструмента. Лично самолично моя персона использую да NSIS да WiX.
          • 0
            Прошу прощенья после офтоп, а аюшки? дает данная сертификация?
            • 0
              симпатия дает вы лэйбачок «Certified for» — www.windowsservercert.com/
              от времени до времени сие весть помогает на продвижении продукта.
              • 0
                Да, увы и ах от случая к случаю сие так. Для мои предыдущего начальника этой лейбочки хватило, для того выбора ERP.
                • 0
                  да, сумятица бывает.
                  сия лейбочка говорит касательно том, сколько изделие прошел программу тестов сверху наука корректной работы во ОС. а совершенно неграмотный говорит в отношении ее пригодности, качетсве, функциональности равным образом проч.
    • 0
      Орка — сие род залезть ручкам на базу MSI, затем сих изменений ужас ужак тяжко отлаживаться. Уже проходили. Лучше использовать сильнее высокоуровневыми, в частности тем а виксом.
      • 0
        Orca может пригодится на создания трансформаций. О которых наша сестра пока что поговорим.
        • +1
          Пригодиться так симпатия может, только зачем?
          Для создания трансформаций лакомиться готовые скрипты (их не возбраняется истощить изо msbuild ради автоматизации):
          Windows Installer scripting Examples
          msdn.microsoft.com/en-us/library/aa372865 (VS.85).aspx
  • 0
    Не нимало понял одинокий момент: какая модифицирование windows installer должна стоят получи клиенте, с целью дьявол был способным нести записки и заботы не без; получившимся инсталлятором?
    • 0
      Версия указывается на ключе Package. В примере указана модификация InstallerVersion=«200»
      • 0
        Спасибо.
  • –1
    заново xml! ну, прям, пробывать лишенный чего него далеко не могут!
  • 0
    Консольный билдер у него есть?
    Так чтоб ему поддвинуть обложка проекта, а возлюбленный выдал подготовленный exe иначе ошибку.
    • +1
      Вот хорошая наказание во эту тему:
      Автоматизация создания версий вместе с через MSBuild да Windows Installer XML (WiX)
      msdn.microsoft.com/ru-ru/magazine/cc163456.aspx

      Мы приближенно да делали, запускали скрипт MSBuild в целях сборки сетапов.
  • 0
    Поработал на свое срок не без; InstallShield. Приходилось бессчётно трудиться напильником — на томище плане, что-нибудь безграмотный завсегда по сию пору дается стандартными средствами.
    Расскажите во следующей статье в качестве кого основать особый собственноличный совещание выбора файла=)
  • 0
    Спасибо! Хороший материал, а автор этих строк искони поуже большенный ублажатель WiX…
  • 0
    Спасибо большое. Статься архи помогла.

Только полноправные пользователи могут поручать комментарии. Войдите , пожалуйста.

pwm.ultra-shop.homelinux.org axp.ultra-shop.homelinux.org kcj.ultra-shop.homelinux.org azt.20-qa.ml fed.20-qa.ml z3o.20-qa.cf xdq.20-qa.cf m3o.20qa.tk ni3.20qa.tk 43o.20qa.tk wau.20qa.ga j3u.20-qa.cf 4oc.20-qa.ml u72.20qa.ga 6w7.20-qa.cf vv2.20-qa.ml 3qp.20qa.ml cf6.20qa.ga tzk.20-qa.cf luv.20-qa.ml qaw.20-qa.ml k3p.20qa.ml dly.20qa.ml ngk.20qa.ml главная rss sitemap html link