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

时间:2018-12-11 21:26:22

标签: angular visual-studio-code vscode-debugger

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

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

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

1 个答案:

答案 0 :(得分:1)

研究了一段时间后,似乎没有任何干净的方法可以终止在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外壳的PID,并将其发送到空中的大型计算机。我们可以寻找PID来占用要为其服务的localhost端口,我假定默认为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",
    }

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