在WiX中收集多个目录

phe*_*bas 5 wix heat wix3.5

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

HarvestDir
          \FeatureA
                   \FeatureImpl.dll
                   \FeatureImpl2.dll
          \FeatureB
                   \FeatureImpl.dll
                   \FeatureImpl2.dll
Run Code Online (Sandbox Code Playgroud)

所以我为每个功能执行heat.exe为每个功能创建一个片段,但我得到基本相同的片段,例如

[...] Source="SourceDir\FeatureImpl.dll"
[...] Source="SourceDir\FeatureImpl2.dll"
Run Code Online (Sandbox Code Playgroud)

我真正想要的是这样的:

[...] Source="SourceDir\FeatureA\FeatureImpl.dll"
[...] Source="SourceDir\FeatureA\FeatureImpl2.dll"
Run Code Online (Sandbox Code Playgroud)

[...] Source="SourceDir\FeatureB\FeatureImpl.dll"
[...] Source="SourceDir\FeatureB\FeatureImpl2.dll"
Run Code Online (Sandbox Code Playgroud)

我可以使用-var来指定一个单独的变量来表示每个特征的源位置,但是我必须将这些变量的值传递给wixproj(我将有~10个特性).

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

stt*_*taq 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>
Run Code Online (Sandbox Code Playgroud)

在 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>
Run Code Online (Sandbox Code Playgroud)

现在您需要在 heat 命令行中使用 -var 传入 PATH1 和 PATH2。获得 .wxs 文件后,您将需要使用以下命令将 Variables.wxi 文件包含在其中:

<?include Variables.wxi ?>
Run Code Online (Sandbox Code Playgroud)

在你的 .wxs 中。这种方式的问题是,您必须在每次生成 WIX 源文件时手动添加此 include 指令,或者必须使用 XSL 转换来注入它。