如何加速Nant构建?

4
我们有很多Nant脚本来编译.NET代码。这些构建需要5-10分钟才能完成,我想找到一种方法来加速它们的运行。
我们的Nant脚本大致如下:
<target name="compile.XYZ" description="Compiles the source code">  
    <msbuild project="${src.dir}\XYZ.sln" verbosity="${build.verbosity}">
        <property name="Configuration" value="${build.config}" /> 
        <property name="OutputPath" value="${build.fullpath}/${prefix.xyz}" />
        <property name="ReferencePath" value="${assembly.dir}" />
    </msbuild>
</target>

它们都很类似。我调查了nant,但它看起来有点过时,所以我有些犹豫使用它,尽管我们的构建中有多个目标,这可能非常方便。

如果你能提供任何帮助来提高这些构建的性能,将不胜感激!

谢谢 :)

4个回答

4

任何构建系统都需要注意确保其了解所有依赖项。在您的情况下,您正在混合使用构建系统,这是可以的,但您必须确保Nant和MSBuild都知道您的依赖项。如果您有两个相互依赖的解决方案,将这些依赖项目移动到它们自己的解决方案中可能会有益,以确保它们在构建周期内仅被构建一次。

确保您利用增量编译。如果您不信任发布候选版的增量构建,请为发布和测试/开发构建使用单独的构建目标。还要确保您正在使用适合运行的构建类型的编译器设置。

任何没有相互编译依赖关系的解决方案可以并行构建。虽然 MSBuild(3.5及更高版本)在同一台机器上原生支持并行构建,但 Nant 不支持(它的 Java 兄弟 Ant 支持)。唯一的补救方法是创建一个仅供构建使用的主解决方案文件。这将允许 MSBuild 并行化独立项目。这篇略旧的 MSDN 文章列出了不同解决方案/项目组织技术的优缺点。您可以通过设置构建集群并在多台机器上构建独立的解决方案,将其提升到新的层次。大多数持续集成服务器都支持此功能。
另一个要考虑的问题是,是否在多个开发项目中遵循 DRY 原则。如果两个不相关的项目具有相似目的的类,则可以将它们合并为一个类并移至共享库。通过消除代码重复,您不仅减少了维护成本,同时还优化了构建过程。如果您的开发人员专注于某些项目,则查找不相关项目中的重复内容是耗时的。

3

你的解决方案中项目越多,构建时间就会越长。 同样的道理也适用于解决方案数量。

这个问题并没有什么可做的。 顺便说一下,这里慢的不是Nant,而是msbuild。

可以尝试一些Scott Hanselsman的建议:

http://www.hanselman.com/blog/FasterBuildsWithMSBuildUsingParallelBuildsAndMulticoreCPUs.aspx

实际上,这要求您将“BuildInParallel =“true””传递给任务,尽管存在某些注意事项。

这将允许在同一解决方案中构建多个项目并行进行,但我没有看到可以并行构建多个解决方案的方法。

为此,您可以创建一个元解决方案(仅由手动维护或在构建之前由nant自动生成),其中添加所有不同的项目。


1
假设你有足够的RAM,我建议购买一个RAM磁盘应用程序(我使用这个one并取得了良好的效果)。
在该驱动器上安装源代码,安装Nant。安装第三方库和其他支持基础设施,这应该可以提高至少33%到50%的性能。
此外,请获取一个SSD,并在其上安装操作系统和.NET框架。两者结合起来应该可以进一步提高性能。

嗨,谢谢回复。如果可能的话,我希望在不购买硬件的情况下解决这个问题。如果有一种方法可以将任务分割成异步运行,那就太理想了... :) - Hewie
我没有意识到你想要分解任务。请看我发的另一个答案。 - AngryHacker

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接