在WiX中收集多个目录

时间:2013-06-14 12:16:08

标签: wix wix3.5 heat

我正在尝试构建一个包含许多功能的安装程序,我正在使用 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个功能)。

那么,有没有什么方法可以在我收获的片段中包含相对路径?

3 个答案:

答案 0 :(得分:3)

不是在每个heat文件夹上使用Feature*,您只需收集已创建的整个功能布局文件夹,并heat转换结果。我假设每个子文件夹都是一个功能。这是一个简单的问题,为每个引用它的所有组件创建ComponentGroup

然后您将使用如下组件组:

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

加热命令(我实际上在WiX 3.7中使用了HarvestDirectory目标):

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>

答案 1 :(得分:1)

您可以在DefineConstants中的.wixproj中分配源路径,也可以在WIX​​包含文件中分配它们,但无论哪种方式,您都必须使用“var”选项来指定用于源的变量。

如果你想在wixproj中使用DefineConstant,那么你将不得不做类似

的事情
        <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”属性中使用project reference variables。例如,使用var.MyProject.TargetDir。

而不是var.BINFOLDER

如果要使用WIX包含文件(.wxi),请在包含文件中声明变量,例如Variables.wxi:

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

现在,您需要使用heat命令行中的-var传入PATH1和PATH2。获得.wxs文件后,您需要使用

包含Variables.wxi文件。
<?include Variables.wxi ?>
你的.wxs中的

。这种方式的问题是,每次生成WIX源文件时都必须手动添加此include指令,否则必须使用XSL Transformation注入它。

答案 2 :(得分:1)

点击设置项目的属性,这是我使用的命令:

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

您需要在构建选项卡中定义的唯一内容是: 选中&#34; define&#39; debug&#39;预处理器变量&#34;的复选框。并输入。

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

请确保您使用所需的标记,例如 suid -dr

有关您在此处看到的标志的更多信息: http://wix.sourceforge.net/manual-wix3/heat.htm