如何减少MSBuild时间

如何减少MSBuild时间,msbuild,build-process,build,build-automation,Msbuild,Build Process,Build,Build Automation,我的处境 在我正在进行的C#项目中,我们有一个相当大的解决方案(80多个项目)。现在,使用MSBuild from时,5分钟以上的重建时间确实成了一个相当大的问题 在我上周做的一次分析中,我的构建时间如下所示: 将文件复制到项目中,并将其重新复制到依赖它的项目中(CopyToLocal),等等(60%) 调用后期生成以反编译/编译。(20%) 进行实际编译等(20%) 除了“正常”项目bin\debugfolders外,还将输出复制到外部目录以设置主“加载程序”。主程序结构有点像这样: \loa

我的处境

在我正在进行的C#项目中,我们有一个相当大的解决方案(80多个项目)。现在,使用MSBuild from时,5分钟以上的重建时间确实成了一个相当大的问题

在我上周做的一次分析中,我的构建时间如下所示:

  • 将文件复制到项目中,并将其重新复制到依赖它的项目中(CopyToLocal),等等(60%)

  • 调用后期生成以反编译/编译。(20%)

  • 进行实际编译等(20%)

  • 除了“正常”项目
    bin\debug
    folders外,还将输出复制到外部目录以设置主“加载程序”。主程序结构有点像这样:

    \loader\bin\loader.exe
    
    \loader\plugin\plugin1\plugin1.dll
    
    \loader\plugin\plugin1\somedependency.dll
    
    我所做的

    为了让事情进展得更快,我想到了以下几点:

  • 将所有文件复制到一个大bin目录中,不要使用CopyTolocal。我不喜欢这样,因为我们不能再使用相同DLL文件的不同版本,我的bin目录变得非常混乱

  • 。这对构建时间的帮助很小

  • 尽量减少项目之间的依赖性,这当然是一件好事

  • 投资硬件。我找到了一些,但这似乎不太可能

  • 我的问题

    我还注意到,当我对位于依赖树根的项目进行更改时,所有内容都得到了重建。即使更改仅在“私有”部分进行,并且项目的接口没有更改

    MSBuild是否使用依赖项目的时间戳来确定项目是否需要重新生成

    是否可以将其更改为其他条件?例如,文件的校验和


    除了这一具体建议之外,我当然非常感谢所有加快构建时间的建议。

    我们也有巨大的解决方案。构建和编译都是关于I/O的

    固态驱动器非常有前景。一位同事在他的笔记本电脑里放了一个固态硬盘,发现它现在比他庞大的主开发盒快得多。没有细节,但他声称要快很多倍

    我们一直在摆弄解决方案文件夹来对项目的各个部分进行分组:这使得开发人员更容易卸载他们不处理的项目

    /m
    很少有助于.NET调试构建
    。几周前,我对此进行了一系列测试,发现了一些细微的差异。调查结果:

    • 因为我的构建受I/O限制,所以使用/m:2-4会使调试构建对我来说更慢
    • 发布构建通常要快得多
    • 代码分析会增加很多时间
    大图:事实上,与获取源代码和运行单元测试相比,编译对我来说是一个相当小的成本。在我们的构建服务器上,集成测试和打包几乎一直在进行。在我的开发箱中,我安排了一个批处理文件,在上班前和午餐时获取源代码、构建和运行单元测试。很好

    在构建服务器上,它更复杂。我们正在考虑在各种机器上建立链式并行构建。我们使用的是VSTS构建,但这样横向扩展成本太高(而且太耗时)

    我为注重细节的人提供的数字。从最慢到最快的配置,运行msbuild“bigsolution.sln”/target:clean-between

  • /m:4,代码分析调试1:38
  • /m:1,代码分析调试1:30
  • /m:4,不进行代码分析的调试1:30
  • /m:1,不进行代码分析的调试1:30
  • /m:1,发布代码分析:1:30
  • /m:4,发布代码分析:1:05
  • /m:4,无代码分析发布:0:53

  • 没有重建或清理的构建时间:~4-10秒

    MSBuild构建时间是一个多维问题。好消息是这很容易解决:

    与构建机器上运行的大多数进程不同,构建进程因占用CPU、RAM和I/O而臭名昭著。加快MSBuild构建的一般方法是“获得金钱所能买到的最好的机器”,特别是:

  • CPU-至少两个Intel 3.0 GHz Core 2 Duo

  • RAM-至少4 GB DDR3。如果这是一台开发人员和构建机器,那么64位操作系统和8GB RAM是更好的选择

  • HDD-最快的选项是高端3ware RAID-1,带有车载电池和启用的写缓存。一个快速的SSD可能是另一个考虑的选项。

  • 网络-最小1Gbit/s卡

  • 这个简单的硬件优化可以将MSBuild的速度提高2-3倍。

    我正在处理500多个C#应用程序项目。项目是并行编译的,copylocal设置为false。在没有单元测试和代码覆盖的情况下,编译时间大约为37分钟。13分钟增量构建,代码不做任何更改

    如果我关闭并行编译并将copylocal设置为true,编译时间将超过1小时40分钟

    对于本地构建、门控签入构建和部署阶段的服务器构建(夜间构建),我有不同的配置

    以下是我的经验:

  • 如果要并行构建项目而不将CopyLocal设置为false,则将输出文件复制到一个目录不是一个好主意。当多个项目引用同一程序集且MSBuild试图同时将此引用复制到输出文件夹时,我的程序集有时会被锁定。这对我很有帮助。我将所有引用的copylocal设置为false,并且我的构建目录大小降低了10倍(减少了10倍的I/O)。我对本地构建和服务器构建有不同的设置。门控签入生成和完全部署生成的不同设置
  • 如果我启用并行构建,构建会更快、更快。如果您有一个强大的构建服务器,那么您的
    /m:2