【问题标题】:How do I speed up Nant Builds?如何加快 Nant 构建速度?
【发布时间】:2011-01-15 02:50:48
【问题描述】:

我们有许多编译 .NET 代码的 Nant 脚本。这些构建需要 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 进行了调查,但它看起来有点过时,所以我有点犹豫要不要使用它,尽管这可能非常方便,因为我们的构建中有多个目标。

非常感谢您在改进这些构建的性能方面提供的任何帮助!

谢谢:)

【问题讨论】:

    标签: build performance nant compilation


    【解决方案1】:

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

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

    任何相互之间没有编译时依赖的解决方案都可以并行构建。虽然 MSBuild(3.5 和更高版本)natively 支持在同一台机器上并行构建,但 Nant 不支持(它的 Java 兄弟,但 Ant 支持)。弥补这一点的一种方法是创建一个仅由构建使用的主解决方案文件。这将允许 MSBuild 并行化独立项目。这个稍微过时的 MSDN article 列出了不同解决方案/项目组织技术的优缺点。您可以通过设置构建场并在多台机器上构建独立的解决方案来将其提升到一个新的水平。大多数持续集成服务器都支持这一点。

    要考虑的另一件事是您的项目是否在多个开发项目中遵循 DRY 原则。如果两个不相关的项目具有类似目的的类,则可以将它们组合成一个类并移至共享库。通过删除代码重复,您不仅可以降低维护成本,还可以同时优化构建过程。如果您的开发人员专注于某些项目,则在不相关的项目中查找重复项非常耗时。

    【讨论】:

      【解决方案2】:

      解决方案中的项目越多,构建所需的时间就越长。 与解决方案的数量相同。

      对此你真的无能为力。 顺便说一句,这里慢的不是 Nant,而是它的 msbuild。

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

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

      实际上,这要求您将“BuildInParallel="true"” 传递给任务,尽管有一些警告。

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

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

      【讨论】:

        【解决方案3】:

        假设您有足够的 RAM,我会购买一个 RAM Disk 应用程序(我使用这个 one 效果很好)。

        在这个驱动器上安装你的源代码,安装 Nant。在那里安装 3rd 方库和其他支持基础设施。它应该产生至少 33% 到 50% 的性能跳跃。

        另外,获取 SSD 并在其上安装 OS 和 .NET 框架。你们一起应该能够进一步减少它。

        【讨论】:

        • 您好。感谢您的回复。如果可能的话,我希望在不购买硬件的情况下解决这个问题。如果有办法将任务拆分为异步运行,那将是理想的...... :)
        • 我没有意识到你想拆分任务。请参阅我的其他答案。
        【解决方案4】:

        另一种方法是让 MSBuild 根据对代码的理解来拆分任务。 您可以使用 /m:x 参数来指定可以使用多少 CPU。或者只是 /m 使用所有。

        一些链接供您阅读:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-13
          • 1970-01-01
          • 2019-06-11
          • 1970-01-01
          • 1970-01-01
          • 2011-07-04
          • 1970-01-01
          相关资源
          最近更新 更多