Сбор нескольких каталогов в WiX

Я пытаюсь создать установщик, включающий ряд функций, и использую heat для сбора каталога файлов для каждой функции.
Моя структура исходных каталогов выглядит примерно так:

HarvestDir
          \FeatureA
                   \FeatureImpl.dll
                   \FeatureImpl2.dll
          \FeatureB
                   \FeatureImpl.dll
                   \FeatureImpl2.dll

Поэтому я выполняю heat.exe для каждой функции, чтобы создать фрагмент для каждой функции, но получаю в основном идентичные фрагменты, например.

[...] Source="SourceDir\FeatureImpl.dll"
[...] Source="SourceDir\FeatureImpl2.dll"

На самом деле мне нужно что-то вроде этого:

[...] Source="SourceDir\FeatureA\FeatureImpl.dll"
[...] Source="SourceDir\FeatureA\FeatureImpl2.dll"

и

[...] Source="SourceDir\FeatureB\FeatureImpl.dll"
[...] Source="SourceDir\FeatureB\FeatureImpl2.dll"

Я мог бы использовать -var, чтобы указать отдельную переменную для представления исходного местоположения для каждой функции, но тогда мне пришлось бы передавать значения для этих переменных в wixproj (и у меня будет ~ 10 функций).

Итак, есть ли способ включить относительный путь в собранный фрагмент?


person pheobas    schedule 14.06.2013    source источник


Ответы (3)


Вы можете либо назначить свои исходные пути в .wixproj в DefineConstants, либо вы можете назначить их во включаемом файле WIX, но в любом случае вам придется использовать параметр «var», чтобы указать переменную, используемую для ваших источников.

Если вы хотите использовать DefineConstant в wixproj, вам нужно будет сделать что-то вроде

        <Target Name="BeforeBuild">
            <PropertyGroup>
              <DefineConstants>BINFOLDER=..\PATH\TO\SOURCE\$(Configuration)</DefineConstants>
            </PropertyGroup>    
            <HeatDirectory OutputFile="output.wxs" Directory="..\PATH\TO\SOURCE\$(Configuration)" DirectoryRefId="INSTALLFOLDER" ComponentGroupName="COMPONENTGROUPNAME" ToolPath="$(WixToolPath)" PreprocessorVariable="var.BINFOLDER" />    
        </Target>

В задаче Heat убедитесь, что вы добавили любые дополнительные атрибуты, которые могут вам понадобиться. Если вы добавили ссылку на исходный проект в .wixproj, вы можете напрямую использовать ссылочные переменные проекта в атрибуте PreprocessorVariable. Например, вместо var.BINFOLDER используйте var.MyProject.TargetDir.

Если вы хотите использовать включаемый файл WIX (.wxi), объявите свои переменные в включаемом файле, например Variables.wxi:

        <?xml version="1.0" encoding="UTF-8"?>
        <Include>
          <?define PATH1="PATH\TO\SOURCE"?>
          <?define PATH2="$(var.PATH1)\$(Configuration)"?>
        </Include>

Теперь вам нужно передать PATH1 и PATH2, используя -var в командной строке heat. Когда у вас есть файл .wxs, вам нужно будет включить в него файл Variables.wxi, используя

<?include Variables.wxi ?>

в вашем .wxs. Проблема с этим способом заключается в том, что вам придется либо добавлять эту директиву include вручную каждый раз, когда вы генерируете исходные файлы WIX, либо вам придется вводить ее с помощью преобразования XSL.

person sttaq    schedule 14.06.2013
comment
XSLT для этого можно найти здесь: sourceforge.net/p/wix/mailman/wix-users/thread/ - person themilkyninja; 14.03.2014

Вместо того, чтобы использовать heat в каждой Feature* папке, вы можете просто собрать всю папку компоновки функций, которую вы создали, и heat преобразовать результаты. Я предполагаю, что каждая подпапка - это функция. Просто создать ComponentGroup для каждого, который ссылается на все находящиеся под ним компоненты.

Затем вы должны использовать группы компонентов следующим образом:

    <Feature Id="FeatureA">
      <ComponentGroupRef Id="FeatureA"/>
    </Feature>
    <Feature Id="FeatureB">
      <ComponentGroupRef Id="FeatureB"/>
    </Feature>

Команда Heat (на самом деле я использую цель HarvestDirectory в WiX 3.7):

Heat.exe dir FeatureLayout -dr FeatureLayoutDir -srd -ag -sfrag -t FeatureLayout.xslt -out obj\Debug\__dir.wxs

FeatureLayout.xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
    xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    exclude-result-prefixes="wix"
    >

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="wix:Wix">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
      <xsl:for-each select="wix:Fragment/wix:DirectoryRef/wix:Directory">
        <wix:Fragment>
          <wix:ComponentGroup Id="{@Name}">
            <xsl:for-each select="descendant::wix:Component">
              <wix:ComponentRef Id="{@Id}"/>
            </xsl:for-each>
          </wix:ComponentGroup>
        </wix:Fragment>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
person Tom Blodget    schedule 17.06.2013

нажмите свойства для проекта установки, это команда, которую я использую:

"%WIX%\bin\heat.exe" dir "$(SolutionDir)\Export\Release" -suid -dr bin -srd -cg ExportComponentGroup -var var.sourcePath -ag -sreg -out "$(SolutionDir)\SetupProject\AppExportDir.wxs"

единственное, что вам еще нужно определить на вкладке сборки: установите флажок «определить переменную препроцессора отладки» и введите.

sourcePath=%SystemDrive%\App\Main\Export\Release\

при этом убедитесь, что вы используете те флаги, которые вам нужны, например suid или -dr

для получения дополнительной информации о флагах, которые вы видите здесь: http://wix.sourceforge.net/manual-wix3/heat.htm

person Gilad    schedule 15.06.2013