65.9K
CodeProject 正在变化。 阅读更多。
Home

加速 Visual Studio 构建

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.98/5 (23投票s)

2011 年 5 月 17 日

Ms-PL

4分钟阅读

viewsIcon

108086

本文讨论了如何缩短构建时间

最近我参与了一个大型项目,其中我们有一个包含大约 100 个项目的解决方案。

为什么一个解决方案中有 100 个项目?

拥有 100 个项目解决方案的原因在于,像现在许多模块化系统一样,我们有以下三个层级

  1. 一些核心/通用项目,每个项目都会使用。
  2. 大量的模块,彼此独立。这个层级直接依赖于第一层。
  3. 一些最终项目,加载不同的模块。这个层级间接依赖于第二层。

image

所以,是的,我们可以创建多个解决方案,每个层级只在需要时编译,并使用 DLL 引用代替项目引用,但所有层级的更改数量仍然足够大,而且我已经看到这种构建过程惨败。所以这是不可行的。

整个解决方案的构建时间需要 15 分钟。由于我们在公司强制执行了门控签入策略,这对开发人员来说确实是一个痛点。

请注意,开发人员的电脑配置足够强大,拥有 8GB 内存、Intel Core i7 CPU 和 SSD 磁盘。

所以我开始调查可以做些什么来改善这种情况。

步骤 1:并行构建项目

尽管 PC 有 8 个逻辑核心,但 Visual Studio 2010 中的构建系统在使用 C# 时,仍然只使用一个核心!(**注意**:C++ 构建系统并非如此。)

所以在浏览网页后,我找到了如何手动触发 **msbuild** 作为 Visual Studio 外部工具,以并行编译您的解决方案。

image

有关如何设置此功能的更多详细信息,请参见 Scott Hanselman 的以下帖子:http://www.hanselman.com/blog/HackParallelMSBuildsFromWithinTheVisualStudioIDE.aspx

设置完成后,我得到了大约 10.2 分钟的构建时间。 对于几分钟的工作来说还不错! 此外,还从我的 CPU 中获得了以下精美图像,您可以在其中真正看到它们在工作

image

步骤 2:小心“复制本地 = True”

在我们的 100 个项目的解决方案中,许多项目相互引用,这是显而易见的。 除了这些引用之外,我们还引用了几个第三方组件,实际上来自每个模块。

以上所有这些导致我们每次编译解决方案时,会**写入超过 4.5 GB** 的文件。 大部分 (95%) 的写入都是 DLL,它们被复制到每个项目的输出文件夹中。

要检查编译中完成了多少次写入,请查看这篇帖子。

无论如何,即使在 SSD 驱动器上,4.5 GB 也需要很长时间才能写入。

因此,下一步是消除这些写入。 为此,我们将所有引用 DLL 中几乎所有的“**复制本地**”设置从默认的 **True** 更改为 **False**。 这将阻止引用的 DLL 被复制到每个项目的输出文件夹中。

image

**注意**:某些文件名已被涂黑以保护客户的财产。

此外,我们还将所有项目的输出文件夹更改为单个文件夹,因此所有生成的 DLL 都被复制到我们实际运行它们的唯一位置。 这样做会将编译时的写入减少到 200 MB 以下,从而节省了大量时间。 具体来说,构建时间缩短到 7.5 分钟!

步骤 3:使用 RAM 磁盘

RAM 磁盘是完全驻留在 RAM 上的逻辑磁盘。
它非常快(比任何 SSD 都快),但每次断电时都会被擦除,因此仅将其用于临时文件。

当然,您应该有足够的 RAM 来容纳这个磁盘(内存仅预先分配用于磁盘使用),但在 8GB PC 上,这通常不是问题。

您可以使用多个程序来设置 RAM 磁盘。 我使用了 DataRam RamDisk,它提供了一个免费版本,能够创建高达 4 GB 的 RAM 磁盘(1 或 2 GB 应该足以进行任何构建)。

RAM 磁盘的配置非常简单

image

下载、安装和格式化新的 RAM 磁盘后,您可以将单个输出文件夹移动到其中。 如果您希望将输出文件夹保留在同一构建驱动器中,则只需在当前输出文件夹和 RAM 磁盘上的文件夹之间创建符号链接即可。 这样可以使 RAM 磁盘的使用成为可选,仅适用于具有足够内存的用户。

要在构建文件夹和新的 RAM 磁盘文件夹之间创建符号链接,请使用以下行

mklink /D C:\Dev\MyCurrnetBuildFolder\Source\bin R:\bin

其中 *R:* 是您的 RAM 磁盘文件夹。

**注意**:您应该根据您的构建文件夹和 RAM 驱动器设置更改路径。

**结果**:添加 RAM 磁盘将编译时间减少到 5 分钟以下! 这是原始时间的 66% 缩减!

摘要

在本文中,我们已经看到了如何缩短构建时间。 当然,我不能做出任何保证。 每个项目都有自己的特点和问题,但如果您符合标准业务应用程序的概况,则提供的步骤可能会缩短构建时间。

暂时就到这里,
Arik Poznanski。

© . All rights reserved.