停止调试时,在vs代码中终止服务任务

问题描述 投票:0回答:2

我有一个Angular项目,目前通过调试器为chrome调试内部vs代码。我的launch.json使用"preLaunchTask": "serve",其中服务在tasks.json中被定义为"ng serve",因此我首先执行“ng serve”并且在调试器打开浏览器以打开http://localhost:4200之前服务器已准备就绪。

一切正常。但是,当我停止调试时,我仍然按预期运行"ng serve"任务,我必须每次手动终止该任务。

我试图在"postDebugTask"中使用launch.json但运气不好,因为vs代码会抱怨启动一个新任务(postDebug),直到另一个正在运行的任务(preLaunch)没有终止。有人可以帮忙吗?

angular visual-studio-code vscode-debugger
2个回答
2
投票

在调查了一段时间之后,似乎没有任何干净的方法来杀死作为preBuildTask的一部分启动的VS Code中的任务。这是一个构建任务,调试任务本身似乎是独立的。由于调试PID本身是针对Chrome的,因此两者之间存在奇怪的分离。

所以,让我们蛮力。

首先,我们需要让我们的初始ng serve作为子进程运行,所以另一个任务不会抱怨占用终端的第一个任务。这项任务对我有用:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "serve",
            "command": "ng serve",
            "isBackground": true,
            "type": "shell",
            "presentation": {
                "reveal": "always"
            },
            "problemMatcher": {
                "fileLocation": "relative",
                "background": {
                }
            }
        }
    ]
}

请注意isBackground属性。这将在他们自己的shell中产生任何未来的任务。 presentationreveal: always所以我们可以看到CLI输出。我们可以通过problemMatcher中的调试过程获得幻想并捕获CLI问题,但现在让我们忘记它。

现在,让我们做一个kill任务。我们不是通过VS Code来查找初始生成的任务,而是通过我们的操作系统来完成。现在,这高度依赖于您使用的操作系统和shell(可以通过shell属性为每个任务配置shell)。

我们需要找到ng serve shell的PID并将其发送到天空中的大型计算机。我们可以查找占用被服务的localhost端口的PID,默认情况下我假设是4200。

示例CMD命令:

for /F "tokens=1,2,3,4,5" %A in ('"netstat -a -n -o | find 4200""') DO ('"Taskill /PID %E /F"')

示例bash / terminal命令(比较通常更简单):

[sudo] lsof -ti:4200 | xargs kill

然后用命令做一个kill任务并将其添加到postDebugTask

    {
        "label": "kill",
        "command": "lsof -ti:4200 | xargs kill",
        "type": "shell",
    }

如果您遇到访问权限,则可以通过以管理员身份运行VS代码或提供已拥有管理员权限的.exe路径来修复它。同样,取决于您的shell和操作系统。


1
投票

正如this S.O. answer所指出的那样,最近在VSCode中添加了从任务运行工作台命令的能力。似乎这个问题的最佳解决方案是运行以​​下任务"postDebugTask": "end serve"

{
   "label": "end serve",
   "type": "process",
   "command":[
      "${command:workbench.action.tasks.terminate}"
   ],
},

这将提示您从下拉列表中选择要终止的任务。不幸的是,我无法找到一种方法告诉VSCode你想通过参数终止什么任务。

正如链接答案中所指出的,如果您只有一个任务可供选择,您可以自动选择该任务

{
   "label": "end serve",
   "type": "process",
   "command":[
      "${command:workbench.action.tasks.terminate}",
      "${command:workbench.action.acceptSelectedQuickOpenItem}",
   ],
},

从而消除了下拉菜单。

© www.soinside.com 2019 - 2024. All rights reserved.