MSBuild 在针对不同配置运行时不必要地运行自定义生成工具

MSBuild unnecessarily runs custombuild tool when run for different configurations

本文关键字:运行 自定义 工具 不必要 运行时 配置 MSBuild      更新时间:2023-10-16

我有一个C++项目,我需要对一些头文件运行自定义构建工具,以生成编译此项目时所需的代码。一般来说,我的配置有效。我触发构建,VS/MSBuild 检测输出文件是否为最新,并仅在必要时运行自定义构建工具。

但是,如果生成与同一项目的另一个配置一起运行,则会出现问题。这两种配置都取决于自定义生成工具的输出文件。因此,如果按顺序运行,则只有一个配置应触发自定义生成工具运行。对于哪个配置,构建在第二个自定义构建工具的输出文件已经存在且是最新的。因此,无需再次构建它们。不幸的是,这正是正在发生的事情。由于自定义构建工具需要相当长的时间才能运行,因此这会大大增加构建时间。另一个有趣的方面是,一旦两个配置都运行,我可以再次触发它们中的任何一个,并且不会调用自定义构建工具。

我对文档的期望是触发自定义构建工具:

  • 如果指定为输出的任何文件丢失
  • 如果我为其指定自定义生成工具的文件的修改晚于指定为输出的任何现有文件的修改时间
  • 如果我指定为
  • 附加依赖项的任何文件的修改晚于指定为输出的任何现有文件的修改时间

但所有这些都独立于触发构建的配置。

有没有人知道为什么会发生这种情况?我检查了两种配置的自定义构建工具的设置是否相同。对于这两种配置,输出文件将生成到同一文件夹中。

您所指的文档基本上是正确的,但它省略了其中的所有内容基本上都是每个项目配置/平台的,因为它使用跟踪器.exe这取决于默认情况下进入中间目录的 .tlog 文件。因此,正如您所发现的,让所有配置对 tlog 文件使用相同的位置应该让跟踪器满意,并且只在需要时调用自定义构建工具,与配置/平台无关。我不确定我会推荐任何这些,共享临时对象文件可能会在以后给您带来问题。

处理此问题的另一种方法是添加一个只有一个配置的单独项目,例如"自定义",然后在那里进行自定义构建。然后使当前项目依赖于该项目,并在解决方案的配置管理器中调整所有条目,以便你现在拥有的每个配置都为新项目生成"自定义"配置。