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

Fre*_*ool 3 msbuild visual-studio

我已将以下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。

d11*_*d11 7

我通过将以下几行添加到我的.vcxproj文件中解决了这个问题:

<PropertyGroup>
    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

它似乎强制 IDE 实际运行 MSBuild。

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


Nik*_*ker 5

线路

========== Build: 0 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========
Run Code Online (Sandbox Code Playgroud)

意味着 Visual Studio 根本不运行 MSBuild。

对于增量构建,VS 使用文件跟踪器来拦截编译器和链接器正在执行的文件操作。结果可能会在ProjName .tlog 文件夹中出现错误。在后续构建中,VS 检查 .read 和 .write 文件中列出的文件的日期,并决定是否运行 MSBuild。此功能在 Hashimi S.、Bartholomew S. - 使用 MSBuild,第 2 版 - 2013 年“文件跟踪器”章节中进行了描述。

一些可能的解决方案:

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