6

我正在尝试构建一个包含许多功能的安装程序,并且我正在使用热量来收集每个功能的文件目录。
我的源目录结构如下所示:

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 个功能)。

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

4

3 回答 3

3

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

然后,您将像这样使用组件组:

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

Heat 命令(我实际上在 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>
于 2013-06-17T17:15:27.100 回答
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”属性中的项目引用变量。例如,使用 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 源文件时手动添加此包含指令,或者您必须使用 XSL 转换注入它。

于 2013-06-14T13:43:24.137 回答
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"

您需要在构建选项卡中定义的唯一其他事情是:选中“定义'调试'预处理器变量”复选框并输入。

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

这请确保您使用您想要的标志,例如suid-dr

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

于 2013-06-15T15:24:23.350 回答