运行不同配置时,MSBuild会不必要地运行custombuild工具

时间:2016-02-25 10:29:51

标签: c++ msbuild visual-studio-2015 build-process custom-build

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

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

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

  • 如果缺少指定为输出的任何文件
  • 如果我指定自定义构建工具的文件的修改时间晚于指定为输出
  • 的任何现有文件
  • 如果我指定为其他相关性的任何文件的修改时间晚于指定为输出
  • 的任何现有文件

但所有这些都与触发构建的配置无关。

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

1 个答案:

答案 0 :(得分:1)

您所指的文档基本上是正确的,但它没有说明其中的所有内容基本上是每个项目配置/平台,因为它使用tracker.exe,它依赖于.tlog文件,默认情况下进入中间目录。因此,正如您所知,使所有配置对tlog文件使用相同的位置应该使跟踪器保持满意,并且仅在需要时调用自定义构建工具,而不依赖于配置/平台。我不确定我是否会推荐任何此类,但共享临时目标文件可能会在以后引起您的问题。

另一种解决方法是添加一个只有一个配置的单独项目,比如'Custom',并在那里进行自定义构建。比使您当前的项目依赖于该项目并在解决方案的Configuration Manager中调整所有条目,以便您现在拥有的每个配置都为新项目构建“自定义”配置。