问题 MSBuild如何检查目标是否是最新的?


MSBuild发出以下消息以获取最新目标:

Skipping target "MyTarget" because all output files are up-to-date with respect to the input files.

如何进行实际检查?


4234
2017-08-08 12:48


起源

你在谈论复制任务和SkipUnchangedFiles参数吗? - sll
我说的是Target,而不是Copy任务 - sergtk


答案:


检查流量 增量构建

目标元素可以同时具有Inputs属性,表示   目标>期望作为输入的项目和输出属性,   表示它产生的输出项目   MSBuild尝试查找1对1映射   这些属性的值之间。如果存在1对1映射,   MSBuild将每个输入项的时间戳与时间戳进行比较   其对应的输出项目。输出没有1对1的文件   映射与所有输入文件进行比较。考虑一个项目   如果其输出文件与其输入的年龄相同或更旧,则为最新   文件或文件。

如果所有输出项都是最新的,MSBuild将跳过目标。这个   目标的增量构建可以显着改善构建   速度。如果只有一些文件是最新的,MSBuild将执行目标   但会跳过最新的项目,从而带来所有项目   最新。这称为部分增量构建。


10
2017-08-08 13:02



谢谢!这是否意味着msbuild有一些带时间戳的缓存数据? - sergtk
我相信虽然MSBuild做了这样的检查,但它可以保留一些表示带有时间戳的文件列表的数据结构,但不确定它在内存中保留了多长时间,因为它只对特定的In && Out目录对有意义 - sll
@sergtk:它跟踪跟踪日志文件(“tlogs”)中读取和写入的所有文件(以及相关的命令行)。您可以在中间目录中看到这些内容。时间戳没有保存 - 如sll所引用的,如果输入比输出更新,那么输出将被重新编译,因此所有需要进行此检查的是依赖图。 (我个人本来希望保存时间戳,因为它会减少角落的情况,但唉......) - Cameron
有谁知道时间戳检查的容差是多少?当我有几个项目时(有 ProjectReference),当它们快速连续完成时,它将多次重建参考。如果我在每个项目之间等待一分钟,那么他们就会正确地看到它之前构建的依赖项是最新的并跳过它。 - Deanna


MSBuild比较输入和输出文件时间戳以确定文件是否是最新的。看到 增量构建 详情。


6
2017-08-08 13:17