Для создания пакетов инсталляции я использую
WiX. На мой взгляд, это простой, удобный и интенсивно развивающийся инструмент с хорошими возможностями. Для того чтобы ускорить процесс разработки своих WiX-проектов я написал небольшую утилиту
wixsubst.
Утилита wixsubst предназначена для автоматической герерации WiX-кода на основании списка файлов на диске. Уже существует утилита
paraffin, которая решает эту задачу. Но она предполагает ведение файла-шаблона. А это, на мой взгляд, не всегда удобно.
Когда я решил написать свою утилиту, я хотел решить следующие задачи:
- удобный вызов из редактора; в качестве параметра можно передать только имя WiX-файла;
- простые правила написания шаблона;
- возможность многократно вызывать утилиту для одного и того же WiX-файла для обновления списка файлов проекта;
Утилита работает следующим образом. Список файлов формируется на основании XML-комментария. XML-комментарий разбит на две части, заголовок и окончание. В заголовке описываются параметры. При вызове утилиты выполняется замена кода между заголовком и окончанием. Вложенные XML-комментарии не поддерживаются.
***
Пример
Нужно создать пакет инсталляции для проекта:
C:\MyProject\MyProject.exe
C:\MyProject\MyProject.exe.config
C:\MyProject\Lib\Lib1.dll
C:\MyProject\Lib\Lib1.xml
C:\MyProject\Lib\Lib2.dll
C:\MyProject\Lib\Lib2.xml |
Для этого в WiX-файле "myproject.wix" пишу следующий код:
...
<Directory Id="INSTALLLOCATION" Name="MyProject">
<Component Id="ProjectFilesComponent" Guid="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx">
<!--#def filesubst
#def directory: C:\MyProject #end
#def exclude: MyProject.exe #end
#def subst: <File Sourse="%path%" Vital="yes"/>
#end-->
<!--#end filesubst-->
</Component>
<Directory Id="LibDirectory" Name="Lib">
<Component Id="LibComponent" Guid="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx">
<!--#def filesubst
#def directory: C:\MyProject\Lib #end
#def mask: *.dll #end
#def subst: <File Id="%filename%" Source="%path%" Vital="yes"/>
#end-->
<!--end filesubst-->
</Component>
</Directory>
</Directory>
... |
И вызываю wixsubst с параметром "myproject.wix". В результате вызова файл "myproject.wix" будет содержать следующий код:
...
<Directory Id="INSTALLLOCATION" Name="MyProject">
<Component Id="ProjectFilesComponent" Guid="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx">
<!--#def filesubst
#def directory: C:\MyProject #end
#def exclude: MyProject.exe #end
#def subst: <File Sourse="%path%" Vital="yes"/>
#end--><File Sourse="C:\MyProject\MyProject.exe.config" Vital="yes"/>
<!--#end filesubst-->
</Component>
<Directory Id="LibDirectory" Name="Lib">
<Component Id="LibComponent" Guid="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx">
<!--#def filesubst
#def directory: C:\MyProject\Lib #end
#def mask: *.dll #end
#def subst: <File Id="%filename%" Source="%path%" Vital="yes"/>
#end--><File Id="Lib1.dll" Source="C:\MyProject\Lib\Lib1.dll" Vital="yes"/>
<File Id="Lib2.dll" Source="C:\MyProject\Lib\Lib2.dll" Vital="yes"/>
<!--#end filesubst-->
</Component>
</Directory>
</Directory>
... |
Все повторные вызовы инструмента wixsubst, не будут модифицировать файл myproject.wix, пока не изменится список файлов проекта. Например, будет добавлена новая библиотека или конфигурационный файл.
***
Как показано в примере утилита wixsubst принимает один параметр - имя WiX-файла. Wixsubst можно вызвать и с двумя параметрами. В этом случае первый параметр будет именем файла-шаблона, а второй - именем результирующего файла.
Заголовок XML-комментария должен начинаться с ключевого выражения "#def filesubst". После ключевого выражения должно следовать описание параметров. Описание каждого параметра должно быть задано следующим образом "#def [имя параметра]: [значение параметра] #end".
Wixsubst поддерживает следующие параметры:
- directory - папка из которой нужно получить список файлов, обязательный параметр;
- exclude - список файлов, которые нужно исключить; файлы разделяются ";";
- mask - маска файлов, которые нужно выбрать;
- subst - шаблон кода WiX, который будет повторен для каждого найденного файла;
Шаблон, описанный в значении параметра subst может содержать специальные переменные "filename" и "path". Имя переменной нужно ограничивать символом "%". Вместо переменной filename будет подставляться имя файла без указания пути. Вместо переменной path будет подставляться имя файла с указанием пути.
Окончание XML-комментария представляет собой постоянное ключевое выражение "#end filesubst".
Для вызова утилиты из Visual Studio можно настроить External Tool (пункт меню Visual Studio Tools > External Tools, затем Add...). Пример настройки:
В результате появится пункт меню Tools > WixSubst. При выборе этого пункта меню будет обработан текущий WiX-файл.
Скачать утилиту можно
здесь. Предложения, замечания приветствуются.