【问题标题】:How to force VS 2010 to skip "builds" of projects which haven't changed?如何强制 VS 2010 跳过未更改的项目的“构建”?
【发布时间】:2012-01-13 22:55:55
【问题描述】:

我们产品的解决方案有 100 多个项目(500+ksloc 的生产代码)。其中大多数是 C# 项目,但我们也很少使用 C++/CLI 来桥接与本机代码的通信。

重建整个解决方案需要几分钟时间。没关系。如果我想重建解决方案,我希望它真的需要一些时间。不好的是完全重建后构建解决方案所需的时间。想象一下,我使用了完全重建,现在没有对解决方案做任何更改,我按下 Build(F6 或 Ctrl+Shift+B)。如果没有变化,为什么需要 35 秒?在输出中,我看到它开始“构建”每个项目 - 它没有执行真正的构建,但它做了一些消耗大量时间的事情。

这 35 秒的延迟真是让人头疼。是的,我可以通过不使用构建解决方案而只使用构建项目 (Shift+F6) 来缩短时间。如果我在我目前正在处理的特定测试项目上运行构建项目,它将需要“仅”8+s。它要求我在正确的项目上运行项目构建(测试项目以确保构建依赖的测试代码)。至少 ReSharper 测试运行器正确地识别出只有这个单个项目必须被构建并且重新运行测试通常只包含 8+s 编译。我目前的编码Kata是:不要碰Ctrl+Shift+B。

即使我不做任何更改,测试项目构建也需要 8 秒。它需要 8 秒的原因是因为它还“构建”了依赖项 = 在我的情况下,它“构建”了 20 多个项目,但我只对单元测试或单个依赖项进行了更改!我不希望它触及其他项目。

有没有办法简单地告诉 VS 只构建完成了一些更改的项目以及依赖于已更改项目的项目(最好将这部分作为另一个构建选项)?我担心你会告诉我,这正是 VS 正在做的事情,但以 MS 方式......

我想改善我的 TDD 体验并减少编译时间(在 TDD 中,编译可能每分钟发生两次)。

更令人沮丧的是,我在一个团队中工作,大多数开发人员在加入这个团队之前曾经从事过 Java 项目。所以你可以想象当他们必须使用VS而不是Java中的完全增量编译时,他们是如何生气的。我不需要incremental compilation of classes。我希望对解决方案进行增量编译。尤其是像 VS 2010 Ultimate 这样的价值数千美元的产品。

我真的不想得到这样的答案:

  • 制作单独的解决方案
  • 卸载不需要的项目

我可以阅读这些答案here。这些不是可接受的解决方案。我们不会花钱让 VS 做出这样的妥协。

【问题讨论】:

  • 我认为这是非常主观的......你有 A LOT 代码,没人知道你有什么规格的机器,你有 SSD 吗? Blah blah blah ... VS2010 已经做了所有可能无法重新编译未更改的代码的事情,所以我认为您不会得到与您想要的答案有很大不同的答案听到。你为什么不在一台超高规格的机器上测试你的编译时间(如果你能得到一台),看看它是否有帮助? Resharper 对 IDE 的速度也毫无帮助。
  • 嗯,这些是我们可以做出的假设,但这并不一定意味着正确。我之前使用过 VS2010 和 SSD,我注意到大型解决方案的构建时间有了相当大的改进。也许值得在构建周期中观察 IO 性能计数器(或其他工具),以确认它是否绝对是 IO。关于硬件的其他观点你是对的。显然,您已经有了一个微调的解决方案。只是你有很多代码。您是否也尝试过未安装 ReSharper 的构建?
  • @Ladislav:您是说“几乎不能访问未更改的项目,也不能访问与我的更改无关的项目”,但让我们从 VS 的角度来看”。 VS 必须确定项目是否已更改,为此它需要扫描所有源文件以分析它们的最后修改时间(至少)。它必须这样做,并且没有内部上下文信息可以提供帮助:首先可以在外部更改文件。现在,如果您有 100 多个项目,那么我假设您在数百个文件夹中有数千个文件,并且确实需要时间来扫描它们。
  • 如果你想提高你的 TDD 体验,那么你可能想看看 NCrunch 项目:ncrunch.net。 NCrunch(重新)在您键入时在后台构建和运行您的代码和测试,因此您不必停止编码、构建您的应用程序,并且仅在运行测试之后。
  • 我刚刚安装了 NCrunch,我不得不说它真的很酷。它绝对有助于提高编译速度,并且即时代码覆盖是一个不错的功能。

标签: c# .net visual-studio-2010 build tdd


【解决方案1】:

默认情况下,当您运行单个项目时,Visual Studio 将始终在您的解决方案中执行每个项目的构建。即使该项目不依赖于您的解决方案中的所有其他项目。

转到工具 | 选项 | 项目和解决方案 | 构建并运行并选中“仅在运行时构建启动项目和依赖项”框。 从现在开始运行您的项目(F5 键)时,Visual Studio 将只构建您的启动项目以及解决方案中它所依赖的那些项目。

【讨论】:

  • 这不是我想要的。我不运行解决方案。我运行测试并且此配置不会影响此行为。即使这样做,它也会产生与仅构建一个测试项目相同的结果。
【解决方案2】:

有没有办法简单地告诉 VS 只构建一些项目 已完成更改以及依赖于更改的项目 (最好将这部分作为另一个构建选项)?我担心你会告诉 我认为这正是 VS 正在做的事情,但以 MS 的方式......

不是真的(你已经明白了)。

您在谈论“构建系统”。 MSVS 不是这样的。它是一个 IDE,它恰好允许您将资产组织到项目和解决方案中,并且是的,可以“构建”。但是,它不是一个构建系统。它永远不会是一个构建系统(说来话长,但需要一种非常不同的技术)。

相比之下,MSVS 是一种用于加速迭代开发的 IDE,包括“调试”周期(例如,系统运行期间调试器中的“单步执行”和“单步执行”)。这就是 MSVS “闪耀”的地方。

它不会,也永远不会像构建系统一样“闪耀”。这不是它被创建的目的。而且,这可能永远不会改变(说来话长,甚至微软也可能同意)。

我不是想变得可爱,我真诚地为传递这个消息道歉。这个答案也让我很伤心。

我希望对解决方案进行增量编译。特别是在 VS 2010 Ultimate 之类的产品,售价数千美元。

MSVS 是用于交互式调试/开发的 IDE,而不是构建系统(见上文)。因此,您是在它不是为它设计的产品场景中测量它,并且它可能永远不会按您的意愿运行。

我真的不想得到这样的答案:

  • 制作单独的解决方案
  • 卸载不需要的项目

我可以阅读这些答案。这些不是可接受的解决方案。 我们不会花钱让 VS 做出这样的妥协。

您的期望是合理的。我也想要它们。但是,MSVS 并不是一个能够实现这一点的产品。

再说一次,我并不是想变得“可爱”。如果您愿意投资“构建系统”,您可能会发现使用 CMake 之类的东西来管理您的配置并导出 Makefiles(或其他东西)来执行您的“真实”构建,但也可以“导出" *.vcproj*.sln 文件,用于在 MSVS IDE 中以迭代方式和交互方式进行工作。

编辑: 相反,您想要的是用于构建工作区的 SSD(固态磁盘)以获得 10 倍的速度提升,或者是 RAM 磁盘以获得 100 倍的提升 -快速构建(不是开玩笑,LGA2011 插槽上的 64MB RAM 为您提供 32MB RAM 磁盘,这就是我们使用的。)

【讨论】:

  • 这是我今天在阅读其他人的答案时认识到的。简而言之,我希望像 VS 这样的昂贵产品应该与在后面运行的构建引擎(MSBuild)进行一些有意义的集成,但似乎没有——它只是在不共享任何上下文信息的情况下运行它。我只想要一个系统,其中更改单个文件中的几行不会导致检查磁盘上数千个文件引起的延迟(如一些评论中所述)。
  • 我的同事今天测试了 RAM 磁盘,他的速度只提高了 2 倍(奇怪)。我将在家用 PC 上使用 SSD 进行一些测试。
  • @Ladislav -- 2x??哎哟。我们仍在配置我们的,所以我还没有可靠的基准测试,但我们正在尝试 (1) RAM 磁盘仅用于中间体 (.obj/.pdb/*.dll/*. exe/etc.) 和 (2) 对于整个工作区(包括所有源)。从网络上的评论来看,配置和使用的 RAM 磁盘软件可以产生很大的不同(我们目前只尝试与 Gillisoft 合作,但似乎有很多不错的可用)。
  • @Ladislav:在我的工作 PC 上,McAffee 的按访问扫描显着降低了所有 RAM 磁盘速度的改进。也许您想查看您的防病毒软件配置(当然,如果您已安装)
【解决方案3】:

您可以做的一件事就是将您的应用分解成小的解决方案,每个解决方案都是一个有凝聚力的部分。分别构建每个解决方案。让每个解决方案都使用它所依赖的解决方案的输出,而不是使用源代码。

这将缩短每个组件的反馈周期

编辑:修改后的解决方案

此外,您将创建一个集成构建,而不是获取所有源代码、编译和测试,它将获得 组件 CI 构建的二进制构建产品 .每次成功构建组件后,都应触发此集成构建运行。

这个构建应该是一个完整构建的二进制等价物(您仍然应该每晚构建它),但运行时间要少得多,因为它在组件增量后触发并且不会'不需要编译或获取任何源代码。

此外,如果您使用支持在多个代理之间分发构建的概念的企业级构建系统,您将能够扩展工作量并将整个 CI 周期缩短到构建最长所需的时间组件,并测试集成套件(最多)。

希望这会有所帮助。

【讨论】:

  • 这将使我获得更短的本地反馈周期,但它会推迟完整的反馈。这就是我不喜欢它的原因。我们有多个部分解决方案和单个全部解决方案。大多数开发人员使用 All 仅仅是因为仅使用部分解决方案经常会导致 CI​​ 服务器上的构建失败 - 有一个包含许多项目的大型共享核心,这些项目必须是所有部分解决方案的一部分 - 这就是它不起作用的原因.这可能是我们的失败,但这与我的问题的要点无关。恕我直言,在 CI 服务器上发现构建失败为时已晚。
  • 谢谢,这解决了问题,Delphi 很聪明,不需要单独的解决方案就可以做到这一点。
【解决方案4】:

在这方面有点晚了,但您是否考虑过使用不同的构建配置?

您可以根据构建配置告诉 Visual Studio 不要构建某些项目。

开发人员可以简单地选择与其工作项目相关的配置。

【讨论】:

    【解决方案5】:

    相当古老的线程,但我可以说我遇到了同一事物的较小版本,我升级到 Visual Studio 2012,问题似乎终于得到解决。到目前为止,上面提到的 RedGate .NET Demon 解决方案似乎也运行良好。

    【讨论】:

      【解决方案6】:

      这是一个老问题。

      使用并行构建和 SSD 。见这里(我认为 - 快速谷歌): http://www.hanselman.com/blog/HackParallelMSBuildsFromWithinTheVisualStudioIDE.aspx

      【讨论】:

        【解决方案7】:

        我找到了一个工具,它可以满足我的大部分需求(甚至更多):RedGate .NET Demon。它可能仍然是第一个版本,因为我在我们的大解决方案中遇到了一些问题(C++ 项目的问题、切换构建目标的问题等等),但到目前为止我真的很喜欢它。我特别喜欢它尝试在 VS IDE 中跟踪更改的文件并仅重建受影响的项目的方式。

        编辑:.NET Demon 已停用,因为 VS 2015 不需要它。它仍然适用于以前的版本。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-29
          • 1970-01-01
          • 2010-12-02
          • 2011-03-21
          • 2017-06-09
          • 1970-01-01
          相关资源
          最近更新 更多