Mas*_*low 2 msbuild parallel-processing
是否可以获取项目列表并且只有在它们不是最新的情况下并行构建它们?
<Target Name="DependenciesLevel7" DependsOnTargets="DependenciesLevel6">
<Message Text="5 items to build" />
<MSBuild Projects="C:\Projects\ApplicationManager.csproj;C:\Projects\Metrics.csproj" Properties="$(CustomAllProperties)" BuildInParallel="true">
<Output TaskParameter="TargetOutputs" ItemName="built_DependenciesLevel7" />
</MSBuild>
Run Code Online (Sandbox Code Playgroud)
这是我正在构建的格式的一个示例,我希望能够并行构建仅在此处不是最新的项目?也许内部的msbuild任务调用是自动并行的?如果是这样,我如何设置它,以便它是基于先前构建任务的增量?(Target DependenciesLevel6)我相信增量构建你必须在目标中使用输入/输出.
问题摘要:
您所描述的"并行增量构建"已经内置(种类),但您真正需要的是并行部分构建.
首先让我解释一下这些概念,然后我将特别回顾它在你的场景中是如何工作的.你需要知道两件事; 增量建筑和部分建筑.我只写了一个博客帖子讨论这个在http://sedodream.com/2010/09/23/MSBuildYouveHeardOfIncrementalBuildingButHaveYouHeardOfPartialBuilding.aspx,但我会在这里粘贴的有关部分.
增量构建是您应该只构建过时的概念.为了支持这个MSBuild,在Target元素上有属性,输入和输出.有了这些属性,你可以(通过输出属性)指定你期待出来,目标的进入目标(通过输入属性)的文件,这些文件.一旦你这样做的MSBuild将比较的输入与输出的时间戳,如果所有输出均达到最新(即投入是老年人),那么目标将被跳过.看看下面非常简单的项目文件.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Files Include="src\01.txt;src\02.txt;src\03.txt;src\04.txt;src\05.txt;"/>
</ItemGroup>
<PropertyGroup>
<Dest>dest\</Dest>
</PropertyGroup>
<Target Name="CopyFiles"
Inputs="@(Files)"
Outputs="@(Files->'$(Dest)%(Filename)%(Extension)')">
<Message Text="CopyFiles" />
<Copy SourceFiles="@(Files)"
DestinationFiles="@(Files->'$(Dest)%(Filename)%(Extension)')"/>
</Target>
<Target Name="DeleteTwoFiles">
<Message Text="DeleteTwoFiles" />
<Delete Files="$(dest)01.txt;$(dest)02.txt"/>
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
在这个项目文件中,我们有两个目标; CopyFiles和DeleteTwoFiles.暂时忽略DeleteTwoFiles.另请注意,我正在执行此构建的目录有一个文件夹src,其中包含Files项目中列出的文件.在CopyFiles目标上,我指定了输入和输出.输入只是@(文件),这是目标正在处理的文件.输出包含表达式@(Files - >'$(Dest)%(Filename)%(Extension)').这与Copy语句中的表达式相同.如果Dest文件夹为空并且我执行CopyFiles目标,则结果如下所示.

正如预期的那样,文件被复制过来,所以这一切都很好.现在如果我再次执行它会发生什么?输出如下所示

因此,您可以看到已跳过目标,因此未执行消息语句"CopyFiles",也不会复制该副本.简而言之,这就是渐进式建筑.现在,包含的所有文件夹DEST,你觉得会发生什么我执行命令msbuild.exe PartialBuilding01.proj /吨:DeleteTwoFiles; CopyFiles?此命令将首先从输出目录中删除两个文件,然后再次调用CopyFiles目标.我们来看下面的结果.

执行CopyFiles目标时,您会看到该语句"部分构建目标'CopyFiles',......".当时间来到执行目标的MSBuild检查的输入和输出,它确定01.txt&02.txt中已经过时的文件,但03.txt,04.txt(因为他们没有目标存在)和05.txt是最新的.所以饲料的MSBuild CopyFiles部分目标为仅包含01.txt和02.txt中的文件项的值,让它做它的事.
现在这在许多方面与你的问题有关,有些不像你希望的那样直接.首先,MSBuild将逐步构建您的项目,因此如果您的项目是最新的,那么它将不会再次构建.问题是,为了让MSBuild确定你的项目是最新的,它必须加载项目运行默认目标(通常是Build),然后目标本身会发现没有工作要做.这个东西本身需要时间.因此,如果项目中包含大量项目或大量文件,那么您可以自己动手.您需要的是一种确定项目是否是最新的方法,并在输入和输出属性中正确表达.一旦你这样做,你应该能够跳过构建最新的项目.
问题的核心是如何使输入/输出正确.如果你能想出办法,你会得到你想要的.你如何制作这将取决于你的场景,但我可以看到这样的事情:
在这种情况下,您假设所有依赖项都完全包含在项目目录下的文件中(可能不是这样).我不是说这是理想的解决方案,而是一种解决方案.
==============================================
编辑:根据下面的questoins进行更新.
您需要将项目放入项目(尽管不是必需的),如ProjectFiles,然后使用@(ProjectFiles)作为输入.对于我所说的输出是困难的部分.您必须找出一种方法来了解(或通过您自己的流程向您表明)项目是最新的.没有内置任何东西.关注增量构建与清洁构建.在完美的世界中,增量和清洁构建是相同的.但有时情况并非如此.对于许多项目来说.如果你开始向构建过程中添加一堆目标并将它们设置为进行增量构建,但是你没有正确实现,那么MSBuild可能会在它们确实过时时跳过目标.一个很好的例子就是当你创建一个目标,其中Inputs设置为一个文件列表,然后Outputs设置为一个创建文件列表.如果您没有扩展清理过程以删除这些创建的文件,那么下次重建时(假设您没有更改文件),当在上一次重建时应该清除目标时,将跳过目标.
| 归档时间: |
|
| 查看次数: |
750 次 |
| 最近记录: |