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

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

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

最佳答案

您可以在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注入它。

08-24 14:38