【问题标题】:Msbuild question构建问题
【发布时间】:2011-07-22 05:25:56
【问题描述】:

我有几个长时间运行的自定义构建任务。然而,它看起来 Visual Studio 在 UI 线程上运行 msbuild 任务,这导致 IDE 挂起。

我在 google 上进行了一些搜索,我能找到的最好的结果是一些错误报告,其响应是“哦,是的,这是个问题,我们可能会稍后修复它”。

http://connect.microsoft.com/VisualStudio/feedback/details/670873/visual-studio-ui-freezes-during-long-msbuild-task

http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/3289eb7d-7989-4350-8c43-02bf9913edbd/.

因此,我决定通过以下方式为我的自定义任务修复它:

  1. 检测它们何时在 Visual Studio 中运行。
  2. 在后台线程上运行任务(如果它们是)
  3. 向 UI 线程添加“MsgWaitForMultipleHandles / 自定义消息泵”,以在运行时保持 UI 响应。

这似乎有效。我现在可以在 IDE 不冻结的情况下运行我的构建。

无论如何,这带来了几个问题:

  1. 这样做安全吗?视觉工作室是一个巨大的东西。如果我这样做,我会遇到任何重入问题吗?这些重入问题会导致世界末日吗,还是我可以忽略它们。

  2. 我使用this post 中概述的技术检测 Visual Studio。基本上,我将“BuildingInsideVisualStudio”属性的值分配给任务的一个属性,我在我的 Execute() 方法中检查该属性。如果是真的,那么我使用多线程行为,否则我只使用顺序行为。但是,这需要每个使用该任务的目标将额外的 goo 放入 msbuild 文件以避免糟糕。理想情况下,我希望“不吸”成为正常行为,无需特殊配置。有什么方法可以在我的任务的 Execute() 方法中检测到 Visual Studio?我可以在任务实现中读取项目属性而不需要对 XML 进行自定义编辑吗?我可以以某种方式询问 Host 对象吗?

谢谢。

【问题讨论】:

  • 我读到“宇宙尽头”部分的问题,很失望
  • 哇。你让你的开发者经历一个漫长的构建周期?
  • 我猜这是讽刺?在任何情况下......“长时间运行”意味着当 IDE 被阻塞并且不会绘制时与它响应时不同。long 的定义可能会发生显着变化。我们的完整构建大约需要 5 分钟,这并不慢。我上一份工作的完整构建花了大约半天时间。我还参与过需要多个构建实验室才能在一天内构建产品的项目。所以,不,我们不会让我们的开发人员进行长时间的构建。但我希望从事我项目的人能够有效地使用他们的工具。没有回应 =​​= 没有效率。
  • @ScottWisniewski 您好,您保持 MSBuild 响应的解决方法对我来说非常有价值。但是,我没有真正理解“向 UI 线程添加“MsgWaitForMultipleHandles / 自定义消息泵”的含义所需的背景知识。您能否发布一些代码(在这里,或者在一个关于如何在长时间构建期间保持 VS 响应的自我回答的问题中)?谢谢。

标签: visual-studio-2008 msbuild


【解决方案1】:

尝试将环境变量 MSBuildNoInProcNode 设置为 1,然后启动 IDE。这将强制 IDE 构建请求到子节点。请注意,这不是经过全面测试的场景,因此可能会出现一些意外行为,但它可能是获得所需结果的替代方法,而无需更改项目文件或所有自定义任务。

【讨论】:

  • 感谢您的建议。我所有的自定义任务都有一个共同的基类,所以我只需要在一个地方对任务进行更改。理想情况下,我想避免以不同于正常方式启动 Visual Studio(这比将 goo 添加到 xml 更容易忘记)。
猜你喜欢
  • 2021-06-24
  • 2016-10-09
  • 2010-09-20
  • 2014-07-15
  • 2012-06-02
  • 2015-05-12
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多