如何减少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