вторник, 2 марта 2010 г.

Утилита Wixsubst

Для создания пакетов инсталляции я использую WiX. На мой взгляд, это простой, удобный и интенсивно развивающийся инструмент с хорошими возможностями. Для того чтобы ускорить процесс разработки своих WiX-проектов я написал небольшую утилиту wixsubst.

Утилита wixsubst предназначена для автоматической герерации WiX-кода на основании списка файлов на диске. Уже существует утилита paraffin, которая решает эту задачу. Но она предполагает ведение файла-шаблона. А это, на мой взгляд, не всегда удобно.

Когда я решил написать свою утилиту, я хотел решить следующие задачи:

  1. удобный вызов из редактора; в качестве параметра можно передать только имя WiX-файла;
  2. простые правила написания шаблона;
  3. возможность многократно вызывать утилиту для одного и того же 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-файл.

Скачать утилиту можно здесь. Предложения, замечания приветствуются.

Комментариев нет:

Отправить комментарий