【问题标题】:How to cancel build process in VisualStudio for a long running custom build tool?如何在 Visual Studio 中取消长时间运行的自定义构建工具的构建过程?
【发布时间】:2017-09-07 23:04:29
【问题描述】:

我有一个自定义构建步骤。在这一步中,我有一个大型长时间运行的工具来将数据库转换为特殊的静态压缩格式。该工具可处理近 2GB 的数据,运行时间长达 30 分钟。

工具处理 Ctrl+C 和 Ctrl+Break。从命令行运行时可以轻松停止。

但是在 VisualStudio 中(我目前使用的是 VS2015)我无法停止这个工具的运行。当我选择Build -> Cancel 时,编译器和链接器停止。但我的工具继续运行。

似乎 VS 不处理它启动的进程的中断信号。

在构建过程中是否有任何技巧或设置可以在不使用任务管理器的情况下中止工具?

【问题讨论】:

  • 看起来这种行为是“by design”。如果您控制工具的来源,可能的解决方法:添加一个参数“/cancel”,它设置一个事件并立即返回。在转换例程中定期检查是否设置了事件,如果设置了,则正常退出程序。在 VS 中,将外部工具添加到“Extras”菜单以使用参数“/cancel”调用您的工具。您必须手动调用此菜单项,但仍然比使用任务管理器更好。
  • 我刚刚发现了这个Visual Studio extension,它允许您在“Cancel-Build”事件上运行工具或脚本。从此您可以使用“/cancel”参数调用您的工具,正如我在之前的评论中概述的那样。

标签: visual-studio visual-studio-2015 build msbuild


【解决方案1】:

编译器和链接器“知道”在您取消构建时停止,因为它们以 MSBuild Tool Task 运行,并且对 ToolCanceled 事件敏感。
虽然您不能对自定义构建步骤做同样的事情,但您可以使用扩展 ToolTask 的类包装您的工具,并在触发 ToolCanceled 事件时终止您的工具。

为此,您需要在您的 msbuild 项目文件中 register a task。这也可以通过inline tasks<Code Type="class" ... 实现

ToolTask 还实现了ICancelableTask,因此您可以在类中覆盖Cancel() 方法并在调用工具时停止工具。
Cancel() 方法将在构建被取消时由 MSBuild 调用。

这是一个实现Cancel()inline task示例:

 <UsingTask TaskName="MyTool" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">

    <ParameterGroup> 
      <!-- Tool parameters -->     
    </ParameterGroup>

    <Task>
      <Code Type="Class" Language="cs">
        <![CDATA[  

      using Microsoft.Build.Utilities;
      using Microsoft.Build.Framework;
      using System;

      public class MyTool : Task, ICancelableTask
      {
         public override bool Execute()
         {
           Log.LogMessage(MessageImportance.High, "MyTool: Build started!");

           // Code to run your tool...
         }

         public void Cancel()
         {         
           Log.LogMessage(MessageImportance.High, "MyTool: Build cancelled!");

           // Code to stop your tool...          
         }
      }

       ]]>
      </Code>
    </Task>
  </UsingTask>

【讨论】:

  • 看来你也可以使用Task,而不仅仅是ToolTask​​。另外,谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多