MSBuild:如何确保AfterBuild目标始终在C ++项目中运行

时间:2015-09-04 11:52:56

标签: visual-studio msbuild

我已将以下AfterBuild任务添加到.vcxproj文件中:

<Target Name="AfterBuild"> <Message Text="Hi" Importance="high" /> </Target>

它似乎仅在构建C ++代码时运行(或者如果我进行重建): 1>------ Rebuild All started: Project: ConsoleApplication1, Configuration: Debug Win32 ------ 1> stdafx.cpp 1> SomeClass.cpp 1> ConsoleApplication1.vcxproj -> 1> Hi D:\Projects\CppTest\Debug\ConsoleApplication1.lib ========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

当C ++代码是最新的时,它不会运行: ========== Build: 0 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========

如何让它始终运行?我正在使用Visual Studio 2015。

5 个答案:

答案 0 :(得分:4)

该行

========== Build: 0 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========

表示Visual Studio根本没有运行MSBuild。

对于增量构建,VS使用File Tracker拦截由编译器和链接器执行的文件操作。结果可以在 ProjName .tlog文件夹中找到。在后续版本中,VS会检查.read和.write文件中列出的文件的日期,并决定是否运行MSBuild。该特征描述于Hashimi S.,Bartholomew S.- Using MSBuild,2nd Edition-2013,&#34; File Tracker&#34;章。

一些可能的解决方案:

  1. 在自定义构建工具中使用FileTracker API。
  2. 在一些.write文件中手动编写工具生成的文件名(此解决方案很简单,但不保证在将来的VS版本中有效)。
  3. 通过MSBuild构建您的解决方案,而不是VS。
  4. 从bat-file构建你的解决方案,首先调用devenv然后调用你的工具。

答案 1 :(得分:1)

我通过在.vcxproj文件中添加以下行来解决此问题:

<PropertyGroup>
    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>

似乎强制IDE实际运行MSBuild。

我在Visual Studio 2015中对其进行了测试。将相同的行添加到导入的.targets文件中没有帮助。

答案 2 :(得分:0)

有一个设置&#34;运行构建后事件:&#34;在Visual Studio中的项目属性中,您需要将其设置为:&#34;始终&#34;使后期构建事件始终运行。

我想它现在已经设置为&#34;成功构建&#34;。

答案 3 :(得分:0)

使用详细日志记录(/ v:详细信息或/ v:diag)构建项目并查找最后运行但在两种情况下都存在的目标(假设它是一个组成目标“FinalCleanup”),然后挂钩你的帖子 - 像这样构建目标而不是特殊名称

<Target Name="RunMyLastTarget" AfterTargets="FinalCleanup">
   <Message Text="Hi" Importance="high" />
</Target>

答案 4 :(得分:0)

我终于和Custom Build Step一起去了。为确保它始终运行,我将Outputs字段设置为某个虚拟文件路径。由于虚拟文件路径从不存在,Custom Build Step始终运行。这很糟糕,但它完成了工作。