2011-08-08 27 views
10

的MSBuild发出以下消息:在最新的目标:MSBuild如何检查目标是否是最新的?

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

如何实际执行检查?

+0

你说的是复制任务和SkipUnchangedFiles参数吗? – sll

+0

我在说目标,不是副本任务 – sergtk

回答

9

检查的Incremental Build流量:

目标元件可以同时具有一个输入属性,其指示 哪些项目目标>预计作为输入,和一个输出属性, ,其指示什么项目它产生如输出 MSBuild尝试在这些属性的值之间找到1对1映射 。如果存在1对1映射,则MSBuild将每个输入项目的时间戳记与其相应输出项目的时间戳记 进行比较。将没有1对1 映射的输出文件与所有输入文件进行比较。如果一个项目的输出文件与其输入文件 的文件或文件的年龄相同或更旧,则该项目被认为是最新的 。

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

+0

谢谢!这是否意味着msbuild具有一些带时间戳的缓存数据? – sergtk

+1

我相信,虽然MSBuild做这样的检查,它可以坚持一些数据结构,它代表一个文件列表的时间戳,但不知道多久它保持在内存中,因为它只适用于特定的In && Out目录对 – sll

+1

@sergtk:它跟踪所有在跟踪日志文件(“tlogs”)中读取和写入文件(以及相关的命令行)。你可以在中间目录中看到这些。时间戳不会被保存 - 如sll所引用的,如果输入比输出更新,那么输出会重新编译,所以它需要做的检查就是依赖关系图。 (我个人更喜欢时间戳被保存,因为它会减少在角落的情况下,但唉......) – Cameron

6

MSBuild比较输入和输出文件时间戳,以确定文件是否是最新的。详情请参阅Incremental Builds

相关问题