![]() |
1
9
(有点) 但你真正需要的是并行部分构建。 http://sedodream.com/2010/09/23/MSBuildYouveHeardOfIncrementalBuildingButHaveYouHeardOfPartialBuilding.aspx 但我会把相关的部分贴在这里。 增量构建是这样一个概念:您应该只构建过时的内容。为了支持此MSBuild,在目标元素上具有属性、输入和输出。使用这些属性,可以指定进入目标的文件(通过“输入”属性)和期望从目标中出来的文件(通过“输出”属性)。执行此操作后,MSBuild将比较输入和输出的时间戳,如果所有输出都是最新的(即输入较旧),则将跳过目标。请看下面非常简单的项目文件。
在这个项目文件中,我们有两个目标:CopyFiles和deletetetetwofiles。暂时忽略DeleteTwoFiles。还要注意,我执行这个构建的目录有一个文件夹src,其中的文件列在files项中。在CopyFiles目标上,我指定了输入和输出。输入只是@(文件),这是目标正在处理的文件。输出包含表达式@(Files->'$(Dest)%(Filename)%(Extension)')。与Copy语句中的表达式相同。如果Dest文件夹为空,我执行CopyFiles目标,结果如下所示。
所以正如预期的文件被复制过来,所以一切都很好。如果我再执行一次会怎么样?输出如下所示
因此,正如您所看到的,目标被跳过,因此没有执行消息语句CopyFiles,也没有执行副本。简而言之,这就是增量建筑。
当CopyFiles目标被执行时,您会看到语句正在部分地构建目标CopyFiles。执行目标MSBuild时,检查输入和输出,确定文件01.txt和02.txt已过期(因为它们在目标中不存在),但03.txt、04.txt和05.txt是最新的。因此,MSBuild feed CopyFiles将只包含01.txt和02.txt的Files项的值作为目标,并让它执行它的操作。
你如何构思这将取决于你的场景,但我可以看到这样的东西:
编辑:根据下面的问题进行更新。 您需要将项目放入一个项目(尽管不是必需的)中,比如ProjectFiles,然后使用@(ProjectFiles)作为输入。对于输出,这就是我所说的是困难的部分。你必须想办法知道(或者通过你自己的流程告诉你)项目是最新的。这里面没有什么东西。 关注增量构建与干净构建。在一个完美的世界里,增量和干净的构建是一样的。但有时情况并非如此。对于许多项目来说,它是。如果开始向构建过程中添加一组目标,并将它们设置为进行增量构建,但没有正确实现,那么当目标确实过期时,MSBuild可能会跳过这些目标。一个很好的例子是创建一个目标,将输入设置为文件列表,然后将输出设置为已创建文件列表。如果不扩展清除过程以删除那些创建的文件,则下次重新生成时(假设没有更改文件),将跳过该目标,而在上次重新生成时应该对其进行清除。 |
![]() |
2
-1
你可能在找 IncrediBuild . |
![]() |
3
-1
我使用与您的配置类似的MsBuild进行并行生成,请不要忘记使用/m选项运行MsBuild。 您可以尝试一个简单的项目,并检查日志,看看它是否是增量的。 |