Утилита 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-файл.
Скачать утилиту можно здесь. Предложения, замечания приветствуются.
Комментариев нет:
Отправить комментарий