gpt4 book ai didi

visual-studio - Visual Studio如何知道我的项目是最新的,因此可以跳过运行MSBuild?

转载 作者:行者123 更新时间:2023-12-04 16:59:03 24 4
gpt4 key购买 nike

我的C++项目中包含一个自定义MSBuild目标,该目标为给定项目类型的每个项目在$(OutDir)文件夹中生成一个数据文件。我将项目类型与属性页模式 Hook ,因此您可以在解决方案资源管理器中的文件上选择它,并且我的目标声明输入和输出,因此增量构建可以正常工作。我还将目标添加到$(BuildDependsOn)属性中,以便在Visual Studio调用构建目标时自动对其进行评估。

除了一件事,一切似乎都可以正常工作:如果我删除$(OutDir)中的输出数据文件之一,然后构建Visual Studio,则什么都不做,并说我的项目是最新的。如果我删除该exe文件,则该项目将生成该项目,或者触摸MSBuild脚本之一的修改时间,Visual Studio将重新评估targt,并发现缺少输出文件,从而导致使用我的目标对其进行重新构建。

从MSBuild诊断日志记录来看,Visual Studio似乎在内部维护一些输出文件和输入文件的列表,它会对其进行检查以避免完全评估MSBuild脚本。如何将输出文件添加到此列表?

最佳答案

MsBuild/VS 确实有一种机制来确定输入文件的最新情况,它围绕着一个可执行的 tracker.exe,它会扫描 .tlog 文件以找出项目的输出文件是什么。可能还有更多内容,如果您在互联网上环顾四周,您可能会获得更多相关信息。

但问题是您并不真正需要了解它的每一个细节:在检查内置 CustomBuildStep 如何工作并将其应用于您的案例时,您可以找到一个简单的使用示例。我将简要解释我是如何做到这一点的,因为我认为它可能对您在处理此类 msbuild 问题时也很有用。

如果添加

<ItemDefinitionGroup>
<CustomBuildStep>
<Command>echo foo &gt; $(OutDir)\foo.txt</Command>
<Outputs>$(OutDir)\foo.txt</Outputs>
</CustomBuildStep>
</ItemDefinitionGroup>

无论是手动还是通过自定义构建步骤的项目属性页,您都会看到行为正是您所需要的:如果 foo.txt 被删除,则构建将开始,而如果不是,则构建被标记为最新(好吧,当其余的输出也是最新的时)。

因此,关键是做 CustomBuildStep 在幕后所做的事情,弄清楚这只是使用您选择的工具在 C:\Program Files (x86)\MSBuild\Microsoft 下的所有文件中搜索所有出现的 CustomBuildStep 的问题。 Cpp\v4.0\V120(根据所使用的平台/VS 版本调整路径)。

这将我们带到 Microsoft.CppCommon.Targets,其中名为 CustomBuildStep 的目标(请注意,它与上面 ItemDefinitionGroup 中的条目名称相同)调用实际的 CustomBuildStep 命令。它还有一个特别有趣的地方:
<!-- Appended tlog to track custom build events -->
<WriteLinesToFile Encoding="Unicode"
File="$(TLogLocation)$(ProjectName).write.1u.tlog"
Lines="@(CustomBuildStep->'^%(Identity)');@(CustomBuildStep->MetaData('Outputs')->FullPath()->Distinct())"/>

因此,这会将输出的路径写入跟踪器使用的目录中的 .tlog 文件,并使其按需要工作。根据我的经验,以 ^ 开头的行只是一个注释——我自己不使用它,我的自定义目标工作正常,同样的说法是 here

tl;dr 使用 WriteLinesToFile 将目标输出的完整路径附加到像 $(TLogLocation)$(ProjectName).write.1u.tlog 这样的文件中。我这么说是因为 write.tlog、write.u.tlog 等也有效。

关于visual-studio - Visual Studio如何知道我的项目是最新的,因此可以跳过运行MSBuild?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35107313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com