MSBuild加速:如何删除不必要的项目构建?

时间:2009-06-08 15:49:13

标签: optimization tfs msbuild

我有一个包含多个项目的解决方案。我们说

项目A取决于项目B和C

项目B取决于项目C

当我在本地计算机上运行我的解决方案时,VS构建每个项目一次,需要1分钟。但是,在我们的构建机器上,构建需要大约4分钟,正如我从MSBuild日志中可以理解的那样,它是这样的:

构建A - >为A构建B,为A构建C

构建B - >为B构建C

所以它多次构建一些项目......我怎样才能加快构建过程?

P.S。这不是额外3分钟的问题,我只是想知道为什么它与我的本地机器构建有如此不同?

5 个答案:

答案 0 :(得分:3)

我不确定您的构建顺序。有时TeamBuild看起来像是在反复构建项目,但它正在为不同的配置构建。看一看,确保没有定义多个FlavorsToBuild。

此外,如果您不想每次都进行新的检查和重建,可以在TFSBuild文件的底部定义。

<PropertyGroup>
    <IncrementalBuild>true</IncrementalBuild>
</PropertyGroup>-->

将其放在</Project>标记之前。

答案 1 :(得分:1)

此示例似乎对我有用。 TestLib.Extra依赖于TestLib。如果我在TestLib中更改某些内容,则两个项目都将构建。如果我只在TestLib.Extra中更改,那么只会构建一个,如果我根本不更改任何内容,他们只会报告跳过目标“CoreCompile”,因为所有输出文件都是最新的等等。

<Target Name="Build">
  <MSBuild Targets="Build" Projects="TestLib\TestLib.csproj" />
  <MSBuild Targets="Build" Projects="TestLib.Extra\TestLib.Extra.csproj" />
</Target>

诀窍是使用项目的“Build”目标,而不是“Rebuild”。它们之间的差异与Visual Studio中构建菜单中“构建”和“重建”命令之间的差异基本相同。

修改

如果项目包含在解决方案文件中,并指定要构建的解决方案,这也很有效:

<Target Name="Build">
  <MSBuild Targets="Build" Projects="TestLib.sln" />
</Target>

答案 2 :(得分:0)

也许和我们一样,您的构建服务器是虚拟机(至少10倍速度)。

此外,TFS(以及其他人)可以对构建进行全新检查,因此无论如何都必须构建所有项目。

答案 3 :(得分:0)

您使用的是/ maxcpucount开关吗?本地计算机与构建计算机之间的处理器数量可能存在差异。您的msbuild文件和visual studio设置之间的设置也可能不同,这也可以解释您在构建时看到的差异。

答案 4 :(得分:0)

我这样做如下。这是一个有点复杂的自定义构建系统,但基本的想法是。

  1. 在许多解决方案中重用的dll都构建到已知文件夹。这是通过使用构建这些常见dll的msbuild项目文件来实现的。
  2. 在解决方案中构建其​​他csproj文件时,我们复制csproj文件,然后使用xslt操作将项目引用替换为这些常见dll的dll引用。
  3. 构建脚本然后使用我们维护的每个解决方案对应的自定义msbuild项目文件构建这些已更改的csproj文件。我们不构建.sln文件。这些自定义项目文件是正确依赖顺序的.csproj文件的项目组。
  4. 也许这可以帮助您实现自己想要的目标。