代码之家  ›  专栏  ›  技术社区  ›  Maslow

你能在项目列表上做并行增量构建吗?

  •  2
  • Maslow  · 技术社区  · 14 年前

    <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>
    

    这是我正在构建的格式的一个例子,我希望能够并行构建只有在这里不是最新的项?内部msbuild任务调用是否自动并行?如果是这样的话,我该如何设置它,使它基于上一个构建任务是增量的?(Target DependenciesLevel6)我认为对于增量构建,必须在目标中使用输入/输出。

    问题摘要:

    • 传递给msbuild任务的项目列表是否自动递增(如果生成已经是最新的,则跳过生成)?
    • 在每个目标都是并行构建的情况下,能否在目标之间进行增量?
    3 回复  |  直到 11 年前
        1
  •  9
  •   Sayed Ibrahim Hashimi    14 年前

    (有点) 但你真正需要的是并行部分构建。

    http://sedodream.com/2010/09/23/MSBuildYouveHeardOfIncrementalBuildingButHaveYouHeardOfPartialBuilding.aspx 但我会把相关的部分贴在这里。

    增量构建是这样一个概念:您应该只构建过时的内容。为了支持此MSBuild,在目标元素上具有属性、输入和输出。使用这些属性,可以指定进入目标的文件(通过“输入”属性)和期望从目标中出来的文件(通过“输出”属性)。执行此操作后,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>
    

    在这个项目文件中,我们有两个目标:CopyFiles和deletetetetwofiles。暂时忽略DeleteTwoFiles。还要注意,我执行这个构建的目录有一个文件夹src,其中的文件列在files项中。在CopyFiles目标上,我指定了输入和输出。输入只是@(文件),这是目标正在处理的文件。输出包含表达式@(Files->'$(Dest)%(Filename)%(Extension)')。与Copy语句中的表达式相同。如果Dest文件夹为空,我执行CopyFiles目标,结果如下所示。

    alt text

    所以正如预期的文件被复制过来,所以一切都很好。如果我再执行一次会怎么样?输出如下所示

    alt text

    因此,正如您所看到的,目标被跳过,因此没有执行消息语句CopyFiles,也没有执行副本。简而言之,这就是增量建筑。

    alt text

    当CopyFiles目标被执行时,您会看到语句正在部分地构建目标CopyFiles。执行目标MSBuild时,检查输入和输出,确定文件01.txt和02.txt已过期(因为它们在目标中不存在),但03.txt、04.txt和05.txt是最新的。因此,MSBuild feed CopyFiles将只包含01.txt和02.txt的Files项的值作为目标,并让它执行它的操作。

    你如何构思这将取决于你的场景,但我可以看到这样的东西:

    1. 在每个项目生成之后,将一个文件放到特定于该项目的已知位置
    2. 在构建项目之前,先扫描其目录,找到最新的文件,然后将项目文件的时间戳更新为该值
    3. 然后可以将项目文件作为输入值,将标记文件作为输出
    4. 然后打电话给你的目标

    编辑:根据下面的问题进行更新。

    您需要将项目放入一个项目(尽管不是必需的)中,比如ProjectFiles,然后使用@(ProjectFiles)作为输入。对于输出,这就是我所说的是困难的部分。你必须想办法知道(或者通过你自己的流程告诉你)项目是最新的。这里面没有什么东西。 关注增量构建与干净构建。在一个完美的世界里,增量和干净的构建是一样的。但有时情况并非如此。对于许多项目来说,它是。如果开始向构建过程中添加一组目标,并将它们设置为进行增量构建,但没有正确实现,那么当目标确实过期时,MSBuild可能会跳过这些目标。一个很好的例子是创建一个目标,将输入设置为文件列表,然后将输出设置为已创建文件列表。如果不扩展清除过程以删除那些创建的文件,则下次重新生成时(假设没有更改文件),将跳过该目标,而在上次重新生成时应该对其进行清除。

        2
  •  -1
  •   Wernight    14 年前

    你可能在找 IncrediBuild .

        3
  •  -1
  •   Benjamin Baumann    14 年前

    我使用与您的配置类似的MsBuild进行并行生成,请不要忘记使用/m选项运行MsBuild。

    您可以尝试一个简单的项目,并检查日志,看看它是否是增量的。

    推荐文章