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

Если вы разрабатываете дополнения / шаблоны / фигуры для Visio, то рано или поздно возникает вопрос, как их распространять / отдавать пользователям  Можно, конечно, просто отправить файл. Однако Visio позволяет устанавливать шаблоны таким образом, чтобы они логично встраивались в пользовательский интерфейс, и были доступны пользователям в том же виде как и встроенные шаблоны (на стартовой странице, в меню "Новая диаграмма", и т.п.). Для разработчиков Visio SDK предоставляет специальный инструмент Solution Publishing Tool, который является официальным способом создания инсталляций, включающих шаблоны и дополнения для Visio. С его помощью можно доработать готовый MSI-пакет, чтобы от включал информацию, специфичную для Visio. Однако данный инструмент не лишен недостатков, в частности:

— Этот инструмент представляет собой программу с пользовательским интерфейсом. К сожалению такое решение не очень хорошо интегрируется с автоматической сборкой, когда все собирается "по нажатию одной кнопки". То есть, каждый раз при создании дистрибутива (новой версии) придется вручную запускать эту программу.

— Данная программа встраивает в инсталлятор vbscript-действия (custom actions) которые могут не понравиться некоторым глупым антивирусам (особенно если инсталлятор не подписан цифровой подписью), или же в сильно ограниченном окружении (когда vbscript запрещен)

Windows Installer Xml (WiX) — это инструмент для создания Windows — инсталляций из XML — кода. От отлично интегрируется в процесс автоматической сборки. Инструмент изначально был разработан в Microsoft и использовался, в частности, для создания инсталляции Microsoft Office. Интегрируется в Visual Studio. И вообще, от супер =)

Данная статья объясняет магию Visio Solution Publishing Tool и показывает как с помощью WiX создать инсталлятор, который бы имел те же самые возможности. Также статья содержит пример / шаблоны проекта для WiX,  который устанавливает файл шаблона и фигур Visio, как на Visio x86 так и на Visio x64.

Создание инсталлятора включает следующие шаги:
— Загрузка и установка WiX (демка делалась на версии 3.6)
— Создание проекта WiX в Visual Studio.
— Добавление Visio — файлов в проект.
— Доработка инсталлятора, чтобы он включал действия, специфичные для Visio  (наиболее сложная и часть; данная статься в основном фокусируется именно на этом). Я полагаю, что для предыдущие пункты делаются достаточно легко, если прочитать-просмотреть какой-нибудь тьюториал по WiX, а тем более если вы уже с ним работали.
Итак, что же именно делает Solution Publishing Tool с инсталлятором? Он заполняет таблицу «PublishComponent» (таблица WindowsInstaller), а также добавляет специальное действие которое говорит Visio перестроить кэш шаблонов, путем модификации специального ключа реестра (ConfigChangeID). Более подробную информацию об этом можно найти в KB832029 или  в данной статье.
WiX, в отличие, например, от встроенного в Visual Studio Deployment Project (ну или Install Shield LE для Visual Studio 2012), не налагает никаких ограничений и предоставляет полный доступ ко всем возможностям Windows Installer. Это означает, что можно определить все необходимые действия необходимые для регистрации расширений, шаблонов и фигур Visio непосредственно в проекте инсталлятора. Что в свою очередь, позволит например собирать весь проект, включая инсталлятор, не выходя из Visual Studio, или же из командной строки, или использовать например такой сервис, как  Azure DevOps (который, неожиданно, тоже поддерживает WiX).

Добавление информации Visio (Component Publishing) в инсталлятор.

После того, как вы создали проект (например с помощью визарда, New Project -> Wix -> Setup Project) и добавили в него файлы Visio, у вас должно получиться что-то вроде:

 <Component Id="StencilA" >
 <File Name="StencilA.vss" />
 </Component>
 

То для того, чтобы «зарегистрировать» файл фигур для Visio, нужно будет добавить элемент <Category>:

 <Component Id="StencilA" >
 <File Name="StencilA.vss" />
 <Category
 Id="{CF1F488D-8D6F-499C-A78D-026E1DF38101}"
 Qualifier="1033\StencilA.vss"
 AppData="X Stencils\Stencil-A" />
 </Component>
 

Данный пример регистрирует файл фигур (стенсил) на английском языке, который называется  «StencilA.vss», в категории «X Stencils» под именем «Stencil-A».
Значения полей элемента <Category> имеют следующий смысл (см. KB832029):

Аттрибут Значение Пример
Id GUID Для шаблонов:
{CF1F488D-8D6F-499C-A78D-026E1DF38100}
Для файлов фигур:
{CF1F488D-8D6F-499C-A78D-026E1DF38101}
Qualifier LocaleID\FileName 1033\flowchart.vst
Замечание Значение LocaleID\FileName должно быть уникальным, т.е. нельзя использовать одно и то же значение для нескольких разных файлов. 
AppData MenuPath|AltNames Flowchart\Work Flow Diagram Shapes|Work Flow Diagram Shapes.vss;workflow.vss

Подробное описание элементов

Значение Описание Пример
ComponentID Предопределенное значение.
Для шаблонов (VST/VTX/VSTX)
{CF1F488D-8D6F-499C-A78D-026E1DF38100}
Для файлов фигур (VSS/VSX/VSSX)
{CF1F488D-8D6F-499C-A78D-026E1DF38101}
LocaleID Десятичноле значение locale ID компонента.  Например:
1033 Английский
1031 Немецкий
1036 Французский
1049 Русский
1033
FileName Имя файла (без пути) шаблона или стенсила (файла фигур) flowchart.vst
MenuPath Для шаблонов, Menu-Path указывает, где данный шаблон должен показываться в дереве меню, и  на стартовой странице. Для файла фигур (стенсила) Menu-Path указывает, где данный шаблон должен показываться в дереве меню.
Если значение не задано, шаблон или стенсил не будет показан в меню.
Если имя начинается с символа подчеркивания (_) то шаблон также не будет показан в меню. Вторая часть определяет имя шаблона в пользовательском интерфейсе.
Flowchart\Work Flow Diagram Shapes.
AltNames Список альтернативных имен, разделенных точкой с запятой. Work Flow Diagram Shapes.vss;workflow.vss

Нотификация Visio перечитать шаблоны.

После добавления установленных шаблонов, Visio необходимо дополнительно сообщить, что  они были добавлены, чтобы он обновил кэш (иначе они не появятся сразу в пользовательском интерфейсе). Это можно сделать, изменив значение параметра ConfigChangeID (integer) в регистре. Данный параметр находится по следующему пути:
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Visio
Можно например просто прибавить 1 к текущему значению, как это делает Visio Solution Publishing :
«VisSolPublish_BumpVisioChangeId32»

 Dim WshShell, visChangeId
 Set WshShell = CreateObject("WScript.Shell")
 Key = "HKLM\Software\Microsoft\Office\Visio\ConfigChangeID"
 On Error Resume Next
 visChangeId = WshShell.RegRead()
 If Err = 0 Then WshShell.RegWrite Key, visChangeId + 1, "REG_DWORD"
 

В WiX есть несколько способов этого добиться:
— Сделать точно так же как это делает Solution Publishing tool, т.е. добавить следующий код в инсталлятор (vbscript custom action):

 <!-- define script action to increment Visio counter -->

<CustomAction
 Id="SetConfigChangeID"
 Script="vbscript"
 Execute="deferred"
 Impersonate="no"
 Return="check" >
 <![CDATA[
 Set WshShell = CreateObject("WScript.Shell")
 Key = "HKLM\Software\Microsoft\Office\Visio\ConfigChangeID"
 On Error Resume Next
 visChangeId = WshShell.RegRead(key)
 If Err = 0 Then WshShell.RegWrite key, visChangeId+1, "REG_DWORD"
 ]]>
 </CustomAction>

<!-- execute script action on install -->

<InstallExecuteSequence>
 <Custom Action="SetConfigChangeID" After="InstallInitialize" />
 </InstallExecuteSequence>

— Реализовать данное действие без использования скриптов (см. реализацию в примере).
К данной статье прилагаются два файла (проекта), которые можно использовать как образец, или как шаблон при написании своего инсталлятора. Первый проект использует скрипт (реализует изменение ConfigChangeID с помощью vb-script), второй реализует то же самое не используя скрипты (используется custom action, написанная на C++). Оба проекта устанавливают 2 шаблона и 2 файла фигур, на английском, и на немецком.  WixSolutionSetup.zip (44.0 KiB) WixSolutionSetup_SC_Script.zip (37.9 KiB)
Проект собирает инсталлятор либо для x86 либо для x64 версии Visio в зависимости от выбранной конфигурации. Инсталлятор создает категорию «X Stencils» для фигур и «X Templates» для шаблонов. Должно нормально работать со всеми (ну, почти всеми) версиями Visio (2003 — 2013).
21-09-2011 0-25-13

Добавить комментарий