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

msbuild加速:如何删除不必要的项目生成?

  •  1
  • Massimiliano  · 技术社区  · 15 年前

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

    项目A取决于项目B和C

    项目B取决于项目C

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

    构建A->构建B用于A,构建C用于A

    构建B->构建B的C

    所以它几次建立了一些项目…如何加快构建过程?

    另外,这不是一个额外3分钟的问题,我只是想知道为什么它与我的本地机器制造如此不同?

    5 回复  |  直到 15 年前
        1
  •  3
  •   Vaccano    15 年前

    我不确定你的建造顺序。有时候TeamBuild看起来像是一次又一次地构建项目,但它是为不同的配置构建的。看一看,确保您没有定义多个flaverstobuild。

    此外,如果不希望每次都进行新的签出和重新生成,则可以在tfsbuild文件的底部定义此项。

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

    把它放在 </Project> 标签。

        2
  •  1
  •   Fredrik Mörk    15 年前

    这个样品似乎对我有用。额外的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>
    

    诀窍是使用项目的“构建”目标,而不是“重建”。它们之间的区别本质上与Visual Studio中“生成”菜单中的“生成”和“重新生成”命令之间的区别相同。

    编辑

    如果项目包含在解决方案文件中,并且您指定了要生成的解决方案,那么这也可以很好地工作:

    <Target Name="Build">
      <MSBuild Targets="Build" Projects="TestLib.sln" />
    </Target>
    
        3
  •  0
  •   leppie    15 年前

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

    另外,tfs(可能还有其他人)在build上执行一个新的签出,因此无论如何它都必须构建所有项目。

        4
  •  0
  •   JNappi    15 年前

    您使用的是/maxcpuccount开关吗?本地计算机和生成计算机之间的处理器数量可能存在差异。在msbuild文件和Visual Studio设置之间,此设置也可能不同,这也可以解释在生成时看到的差异。

        5
  •  0
  •   softveda    15 年前

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

    1. 在许多解决方案中重用的DLL被构建到一个已知的文件夹中。这是通过使用构建这些公共DLL的msbuild项目文件实现的。
    2. 在解决方案中构建其他csproj文件时,我们复制csproj文件,然后使用XSLT操作将这些常见dll的项目引用替换为dll引用。
    3. 然后,构建脚本使用我们维护的与每个解决方案对应的自定义msbuild项目文件来构建这些更改的csproj文件。我们不建立.sln文件。这些自定义项目文件是.csproj文件的项组,它们的依赖顺序正确。

    也许这能帮助你实现你想要的。