【问题标题】:WiX Heat: Pre-build event fires too early on build serverWiX Heat:预构建事件在构建服务器上过早触发
【发布时间】:2026-01-17 22:50:01
【问题描述】:

我正在为我的 Visual Studio 解决方案收集一个目录。

到目前为止,它可以在我的本地系统上运行,可能是因为项目构建顺序受到尊重。

当我在构建服务器上运行安装程序时,它会找到正确的目录,但在构建安装文件时尚未创建它。它会抛出一个HEAT5052 错误说The directory 'a:\b\c' could not be found

有没有什么方法可以“等待”直到或在所有项目引用构建后执行 heat 命令?

【问题讨论】:

  • 你检查你的目录的引用是否在服务器上是正确的?您的路径中可能有任何空格?
  • 是的,但这不是问题。查看我下面的帖子以获得答案。
  • 我也遇到了同样的问题;我已经能够通过设置明确的构建顺序来解决它,以确保安装项目真正最后构建。 (在Visual Studio中右键项目,选择“Build dependencies->Project dependencies”,在对话框的“Dependencies”页面中勾选所有项目。)

标签: msbuild wix heat


【解决方案1】:

好的,所以我花了几个小时来弄清楚如何在所有引用都被重新处理后触发Heat。我只使用Heat 命令行和BeforeBuildAfterBuild 目标找到了<PreBuildEvent><PostBuildEvent> 的解决方案。

所以我在我的 wix2010.targets 文件中找到了所有类型的目标 Program files (x86)\MSBuild\Microsoft\Wix\ 文件夹。它包含一个名为AfterResolveReferences 的目标,它就是这样做的。所以这是我最终得到的代码(以防有人感兴趣):

<Target Name="AfterResolveReferences">
    <HeatDirectory
        ToolPath="$(WixToolPath)"
        OutputFile="Product.Binaries.wxs"
        SuppressFragments="$(HarvestDirectorySuppressFragments)"
        Transforms="Filter.xslt"
        Directory="$(HarvestFolder)"
        DirectoryRefId="MY_FOLDER"
        ComponentGroupName="Binaries"
        GenerateGuidsNow="true"
        SuppressRootDirectory="true"
        SuppressRegistry="true"
        PreprocessorVariable="var.App.TargetDir">
    </HeatDirectory>
</Target>

【讨论】:

  • 谢谢你。您是否知道在尝试解决此问题后,我如何将头发粘在头上?
【解决方案2】:

我遇到了同样的问题,通过结合接受的答案和this answer 来确保我的复制文件的构建后事件始终运行:

<RunPostBuildEvent>Always</RunPostBuildEvent> 
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>

另外,我的构建服务器正在使用 MSBuild 命令行,我使用 this answer 来定位我的本地 MSBuild.exe,这样我就可以在本地测试我的更改,而无需推送到构建服务器。

【讨论】: